如何使用交叉引用表混合左连接和右连接

xytpbqjk  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(355)

我正在使用mysql。
我有一张table A(ida) 和table B(idb) 和一张对照表 CR(ida, idb) .
我想在查询中捕获 A 以及 B (基本上是 CR )但我也要所有的行 A 以及 B 没有关系的 CR . 要得到这样的东西:

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 在上一个案例中。我还使用大括号试图在连接中强制一些优先级,但结果是相同的。

eagi6jfj

eagi6jfj1#

连接从左到右求值。您的查询的操作顺序就好像您使用了如下括号:

(A LEFT JOIN CR) RIGHT JOIN B

因此它必须返回b中的所有行。
但它只返回(左连接cr)中匹配的行。联接的该部分将包括a中的所有行,但根据后续右联接的联接条件,可能会排除其中一些a行。
从你的描述来看,听起来你真的很想 FULL OUTER JOIN . mysql不支持这种类型的外部连接。有几种方法可以通过使用两个连接的并集来模拟它:

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

mysql支持完全外部连接的特性请求是在2006年提出的。如果您需要这个,您应该登录到bug跟踪器,并在该特性请求上单击“影响我”。

相关问题