Подтвердить что ты не робот

T-SQL "Где не в" с использованием двух столбцов

Я хочу выбрать все записи из таблицы T1, где значения в столбцах A и B не имеют соответствующего набора для столбцов C и D в таблице T2.

В mysql "Where not in" , используя два столбца, я могу прочитать, как это сделать, используя форму select A, B из T1, где (A, B) не в (SELECT C, D из T2), но это не работает в T-SQL для меня, что приводит к "Некорректному синтаксису рядом", ".".

Итак, как мне это сделать?

4b9b3361

Ответ 1

Используйте коррелированный подзапрос:

  ... 
WHERE 
  NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b
  )

Удостоверьтесь, что существует составной индекс в SecondaryTable над (c, d), если только эта таблица не содержит много строк.

Ответ 2

Вы не можете сделать это, используя инструкцию типа WHERE IN.

Вместо этого вы могли бы LEFT JOIN в целевой таблице (T2) и выбрать, где T2.ID - NULL.

Например

SELECT 
    T1.*
FROM
    T1 LEFT OUTER JOIN T2
    ON T1.A = T2.C AND T1.B = T2.D
WHERE
    T2.PrimaryKey IS NULL

будет возвращать только строки из T1, которые не имеют соответствующей строки в T2.

Ответ 3

Я использовал его в Mysql, потому что в Mysql нет инструкции "EXCLUDE".

Этот код:

  • Сопоставляет поля C и D таблицы T2 в одно новое поле, чтобы упростить сравнение столбцов.
  • Сопоставляет поля A и B таблицы T1 в одно новое поле, чтобы упростить сравнение столбцов.
  • Выбирает все записи, где значение нового поля T1 не равно значению нового поля T2.

SQL-выражение:

SELECT T1.* FROM T1 
  WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2)