Mysql 如何基于两列联接两个表,并验证两个表中是否都存在一列
让我举个例子来理解我的问题 假设我有一个表a和一个表B。这些表可以基于列进行连接(假设两个表中都有x和y) 我想基于x和y连接这两个表,以找出表A中的所有行,其中表B中不存在该对(x,y) 我现在做的是:Mysql 如何基于两列联接两个表,并验证两个表中是否都存在一列,mysql,left-join,two-columns,Mysql,Left Join,Two Columns,让我举个例子来理解我的问题 假设我有一个表a和一个表B。这些表可以基于列进行连接(假设两个表中都有x和y) 我想基于x和y连接这两个表,以找出表A中的所有行,其中表B中不存在该对(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中不存在,并且确保只有x在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中的偶(x,y)在B中不存在,并且确保只有x在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
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)
这将返回A中的所有行,其中
- B没有
A(x,y)
- B有
A(x)
之外的子查询通常性能较差,这可能会更快:
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
;
编辑:不要忘记子查询中的不同的
,否则您将得到每个x值的结果,该x值在B中的每个实例都会重复。您可以发布一些示例数据和预期结果吗。是的,这就是为什么我说我知道这不是更好的方法,因为我想这会降低性能