我有一个定义表,我知道它没有被很好地维护,我们称之为表A
。我有另一个表(称之为表B
),它要小得多,理想情况下应该是表A的子集
,但我知道表A
有些过时,不包含表B
中的新条目。
请注意,表A和表B具有不同的列。
Table A:
ID, Name, blah, blah, blah, blah
Table B:
ID, Name
我想要在B表中选择所有的行,其中B表的ID在A表中不存在。这不仅仅是匹配A表中的行;我只想要B表中ID完全不存在于A表中的行。
SELECT *
FROM B
WHERE NOT EXISTS (SELECT 1
FROM A
WHERE A.ID = B.ID)
几乎适用于所有环境的经典答案是
SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL
有时候 NOT EXISTS 可能没有被实现(不起作用)。
如果您决定使用 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
);
或者如果“NOT EXISTS”未被实现
SELECT *
FROM B
WHERE (SELECT count(*) FROM A WHERE A.ID = B.ID) < 1
Select 1
表示每行返回1
作为结果。通常用于表示结果无关紧要,只有存在性才是重要的。您可以将1
更改为任何有效值(*、1、2、3、column1、column2),而结果不会改变。 - gdoron