Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何基于两列联接两个表,并验证两个表中是否都存在一列_Mysql_Left Join_Two Columns - Fatal编程技术网

Mysql 如何基于两列联接两个表,并验证两个表中是否都存在一列

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中存在的偶 有什么想法吗 我有以下

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

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

根据我的经验,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
;

编辑:不要忘记子查询中的
不同的
,否则您将得到每个x值的结果,该x值在B中的每个实例都会重复。

您可以发布一些示例数据和预期结果吗。是的,这就是为什么我说我知道这不是更好的方法,因为我想这会降低性能