sql:检查表B中是否存在表A中的条目


79

我有一个定义表,我知道它不会很好地维护,让我们称之为table A。我有另一个表(称为表table B),该表要小得多,理想情况下应该是a,subset of table A但我知道那table A有些陈旧,并且不包含in中的新条目Table B

请注意,表A和B具有不同的列。

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

我想要表B中的所有行,以使表B中的ID在表A中不存在。我只希望表B中的ID在表A中根本不存在的行。

Answers:


169
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)

@ algotr8der,很高兴能为您提供帮助。美好的一天。
gdoron支持Monica

10
select * from TableB b where b.ID not in (select a.ID from TableA a)
vakio

2
@vakio感谢您的查询。您绝对应该把您的评论作为答案。
分析僧侣

@AnalyticalMonk我希望您知道它是完全相同的查询,它产生的结果完全相同。只是语法稍有不同,仅此
而已

2
@ManosKounelakisSelect 1意味着返回1每一行的结果。通常用它来表示结果无关紧要,但仅存在是重要的。您可以更改1为每个有效值(*,1、2、3,column1,column2),并且结果不会更改。
gdoron支持Monica's

28

适用于几乎所有环境的经典答案是

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

有时,NOT EXISTS可能未实现(不起作用)。


谢谢,这很有帮助!
lenach87

此查询比SELECT * FROM B WHERE NOT EXISTS(从A WHERE A.ID = B.ID的SELECT 1)更有效
teteArg

DUAL是特殊的一行,一列表在所有Oracle数据库中默认存在。DUAL的所有者是SYS(SYS拥有数据字典,因此DUAL是数据字典的一部分。),但每个用户都可以访问DUAL。该表具有一个名为DUMMY的VARCHAR2(1)列,其值为'X'。MySQL允许在不需要任何表数据的查询中将DUAL指定为表。在SQL Server中,DUAL表不存在,但是您可以创建一个。
David Kariuki

14

如果您设置使用EXISTS,则可以在SQL Server中使用以下内容:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)

1

这也有效

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);

0

或者,如果未实现“ NOT EXISTS”

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.