У меня есть таблица определений, которая, как я знаю, поддерживается не очень хорошо, давайте назовем ее table A
. У меня есть другая таблица (назовите ее table B
), которая намного меньше и в идеале должна быть таблицей, subset of table A
но я знаю, что table A
она несколько устарела и не содержит новых записей, находящихся в Table B
.
Обратите внимание, что таблицы A и B имеют разные столбцы.
Table A:
ID, Name, blah, blah, blah, blah
Table B:
ID, Name
Я хочу, чтобы все строки в таблице B были такими, чтобы идентификатор в таблице B НЕ существовал в таблице A. Это не просто соответствует строкам в таблице A; Мне нужны только строки в таблице B, где ID вообще НЕ существует в таблице A.
select * from TableB b where b.ID not in (select a.ID from TableA a)
Select 1
означает возврат1
в качестве результата для каждой строки. Он часто используется для обозначения того, что результаты не имеют значения, но важно только существование. Вы можете изменить1
любое допустимое значение (*, 1,2,3, столбец1, столбец2), и результаты не изменятся.Классический ответ, который работает практически в любой среде:
SELECT ID, Name, blah, blah FROM TableB TB LEFT JOIN TableA TA ON TB.ID=TA.ID WHERE TA.ID IS NULL
иногда НЕ СУЩЕСТВУЕТ может быть не реализовано (не работает).
источник
Если вы настроены на использование EXISTS, вы можете использовать в SQL Server следующее:
SELECT * FROM TableB as b WHERE NOT EXISTS ( SELECT * FROM TableA as a WHERE b.id = a.id )
источник
Это тоже работает
SELECT * FROM tableB WHERE ID NOT IN ( SELECT ID FROM tableA );
источник
Или если "НЕ СУЩЕСТВУЕТ" не реализовано
SELECT * FROM B WHERE (SELECT count(*) FROM A WHERE A.ID = B.ID) < 1
источник