如何在MS Access中获取一个表中不在另一个表中的所有行?

9

我尝试了很多不同的方法,但总是出现语法错误。

我有两个表 - tableA 和 tableB。它们都有一个 con_number 字段作为唯一标识符。 我想选择在 tableA 中不存在的所有行。

请问有人可以给我这个查询吗?在 MS Access 中应该怎么写呢?

我知道在这种情况下使用 NOT IN 是相当低效的,如果有更好的方法那就太棒了。

谢谢。

4个回答

19
SELECT TableB.con_number
FROM TableB
WHERE NOT EXISTS (SELECT 1 
                  FROM TableA 
                  WHERE TableA.con_number = TableB.con_number);

你打败了我太棒了;-)你可以通过每一行缩进4个空格来增加帖子的可读性(高亮显示并按下代码示例按钮即可完成此操作)。 - Smashery
@Ian Quigley:发布的 SQL 没有使用 NOT IN,而是使用了 NOT EXISTS。 - onedaywhen
+1 我已经研究过了,Not exists 也同样快速。删除了我的回答。我的错! - Dead account
1
为什么“SELECT 1”行的值是1? - ChrisG

2

NOT IN版本(速度较慢但稳定):

SELECT con_number
FROM TableB
WHERE con_number NOT IN (SELECT con_number FROM tableA);

实验版本(不确定是否更快,可以试试):

SELECT B.con_number, MAX(A.con_number) AS check
FROM tableB B LEFT JOIN tableA A ON B.con_number = A.con_number
GROUP BY B.con_number
HAVING check IS NULL;

注意:两者应该是相当标准的SQL,我不知道任何ms-access特定的功能。

2

有一个名为“查找不匹配”的向导可以设置此选项。SQL 语句为:

SELECT TableB.con_number
FROM TableB LEFT JOIN TableA 
ON TableB.con_number = TableA.con_number
WHERE TableA.con_number Is Null

0

我记得有类似这样的:

SELECT * FROM TableA.* LEFT JOIN TableB _
    ON TableA.con_number = TableB.con_number WHERE 'criteria'

但我不记得要使用哪个“条件”

... TableA.con_number <> TableB.con_Number
... TableB.con_number IS NULL
... TableA.con_number NOT like TableB.con_Number

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接