morfizm (morfizm) wrote,
morfizm
morfizm

Category:

SQL Left Semi Join

Как я и ожидал, следующие два запроса генерируют совершенно одинаковый execution plan (большой dataset, C имеет clustered index на field2):

INSERT INTO A
    SELECT * 
        FROM B
        WHERE field1 IN (SELECT field2 FROM C)

INSERT INTO A
    SELECT * 
        FROM B
        WHERE EXISTS (SELECT field2 FROM C WHERE field2 = field1)
Причём процесс, происходящий между таблицами C и B, гордо именуется "Left Semi Join", что означает буквально то, что написано в вышеприведённых фрагментах.

Интересно, существует ли стандартное название для ещё более хитрого join'а: для каждой строки из B взять одну (TOP 1) совпадающую строку из C, но каждую строку из C использовать не более, чем 1 раз? (Мне предстоит решить эту задачу сегодня-завтра).
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 25 comments