【问题标题】:How to mix left and right joins with cross reference table如何使用交叉引用表混合左右连接
【发布时间】:2023-03-18 01:12:02
【问题描述】:

我正在使用 Mysql。

我有表 A(ida) 和表 B(idb) 和一个交叉引用表 CR(ida, idb)

我想在查询中捕获AB 之间的关系(基本上是CR),但我还想要来自AB 的所有行在@ 中没有关系987654329@。要得到这样的东西:

ida | idb
=========
 X  | nul
 Y  |  1 
nul |  2 

我试过了:

select * from
A
left join CR on (...)
right join B on (...)

这样我从B 获取所有行,但不是从A 获取所有行。

如果我这样做A left join CR left join B,我会从A 获得所有信息,但不是从B 获得所有信息。这是预期的。但我不明白为什么 right join 在前一种情况下会掩盖 left join。我还使用大括号来尝试强制连接中的某些优先级,但结果是一样的。

【问题讨论】:

    标签: mysql sql join full-outer-join


    【解决方案1】:

    从左到右评估联接。您的查询的操作顺序就好像您使用了这样的括号:

    (A LEFT JOIN CR) RIGHT JOIN B
    

    因此它必然会返回 B 中的所有行。

    但它只会从 (A LEFT JOIN CR) 返回匹配的行。连接的那部分将包括 A 中的所有行,但根据后续右连接的连接条件,可能会排除其中的一些 A 行。

    根据您的描述,听起来您确实想要FULL OUTER JOIN。 MySQL 不支持这种类型的外连接。有一些方法可以通过使用两个连接的 UNION 来模拟它:

    ...
    A LEFT OUTER JOIN B
    UNION
    A RIGHT OUTER JOIN B
    ...
    

    The feature request of MySQL to support FULL OUTER JOIN 于 2006 年提交。如果您需要这个,您应该登录错误跟踪器并在该功能请求上单击“影响我”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2013-02-04
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多