如何混合使用交叉引用的左右联接 table

How to mix left and right joins with cross reference table

我正在使用 Mysql。

我有 table A(ida) 和 table B(idb) 和交叉引用 table CR(ida, idb).

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

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 。我还使用大括号尝试在联接中强制执行某些优先级,但结果是一样的。

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

(A LEFT JOIN CR) RIGHT JOIN B

因此它绑定到 return B 中的所有行。

但它只会 return 匹配来自 (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 年提交。如果您需要这个,您应该登录错误跟踪器并在该功能请求上单击“影响我”。