如何根据两列连接两个表并验证一列是否存在于两个表中

How to join two tables based on two columns and verifying that one column is existing in both

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

说我有一个 table A 和一个 table B。table 可以根据列连接(比如 x 和 y)。

我想根据 x 和 y 加入两个 tables 以找出 table A 中 table 中不存在对 (x,y) 的所有行=] B.

我现在做的是:

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 中拥有 B 中不存在的对 (x,y),并且确保仅针对 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)

感谢您的帮助!

此致

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)

这 return 来自 A 的所有行,其中

  • B 没有 A(x,y)
  • B 有 A(x)

根据我的经验,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 值的重复结果。