如何根据两列连接两个表并验证一列是否存在于两个表中
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 值的重复结果。
让我举个例子来理解我的问题。
说我有一个 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 值的重复结果。