如何基于两列连接两个表并验证

时间:2016-02-25 17:11:49

标签: mysql left-join two-columns

让我举一个例子来了解我的问题。

说我有一个表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)

感谢您的帮助!

最好的问候

2 个答案:

答案 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中的所有行,其中

  • B没有A(x,y)
  • B有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值的结果。