【问题标题】:How to join two tables based on two columns and verifying that one column is existing in both如何基于两列连接两个表并验证两者中是否存在一列
【发布时间】:2016-02-25 17:11:49
【问题描述】:

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

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

感谢您的帮助!

最好的问候

【问题讨论】:

标签: mysql left-join two-columns


【解决方案1】:

根据我的经验,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,否则你会得到每个 x 值在 B 中的每个 x 值实例重复的结果。

【讨论】:

  • 是的,这就是为什么我说我知道这不是更好的方法,因为我猜它会降低性能
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多