让我举一个例子来了解我的问题。
说我有一个表A和一个表B.这些表可以根据列连接(比如两个中的x和y)。
我想基于x和y连接两个表,找出表A中表示B中不存在couple(x,y)的所有行。
我现在所做的是:
SELECT * FROM A a
LEFT JOIN B b
ON a.x = b.x AND a.y = B.y
WHERE b.x IS NULL AND b.y IS NULL;
结果还可以......
但我想在A中有一对夫妻(x,y)在B中不存在,并且只确定在B中存在x的夫妻......
有什么想法吗?
我有想法做以下事情:
SELECT * FROM A a
LEFT JOIN B b
ON a.x = b.x AND a.y = B.y
WHERE b.x IS NULL AND b.y IS NULL
AND x in (SELECT x FROM B);
这有效,但对我来说似乎不是一个好方法......
示例数据将是:
在A中,我们有(x,y): (1,2) (1,5) (2,3) (3,7)
在B中,我们有(x,y): (1,4) (1,5) (3,9)预期结果是:
(1,2) (3,7)
感谢您的帮助!
最好的问候
答案 0 :(得分:0)
SELECT A.*
FROM A
WHERE NOT EXISTS (SELECT 1
FROM B
WHERE B.x = A.x
AND B.y = A.y)
AND EXISTS (SELECT 1
FROM B
WHERE B.x = A.x)
这将返回A中的所有行,其中
A(x,y)
A(x)
答案 1 :(得分:0)
根据我的经验,FROM
子句之外的子查询通常表现不佳,这可能会更快:
SELECT *
FROM (SELECT DISTINCT x FROM B) AS bsAs
INNER JOIN A AS a ON bsAs.x = A.x
LEFT JOIN B AS b ON a.x = b.x AND a.y = B.y
WHERE b.x IS NULL AND b.y IS NULL
;
编辑:不要忘记子查询中的DISTINCT
,否则您将获得B中该x值的每个实例重复的每个x值的结果。