我使用的是Mysql。
我有表A(ida)和表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。我还使用了大括号来尝试在连接中强制一些优先级,但结果是相同的。
发布于 2020-07-26 23:20:23
连接从左到右进行计算。查询的操作顺序就像使用了如下所示的括号:
(A LEFT JOIN CR) RIGHT JOIN B因此,它必然会返回B中的所有行。
但它只返回来自(A LEFT JOIN CR)的匹配行。连接的这一部分将包括来自A的所有行,但根据后续右连接的连接条件,可能会排除其中一些A行。
从你的描述来看,听起来你真的很想要一个FULL OUTER JOIN。MySQL不支持此类型的外部联接。有几种方法可以通过使用两个连接的联合来模拟它:
...
A LEFT OUTER JOIN B
UNION
A RIGHT OUTER JOIN B
...The feature request of MySQL to support FULL OUTER JOIN是在2006年提交的。如果你需要这个,你应该登录到bug跟踪器,并在该功能请求上单击“影响我”。
https://stackoverflow.com/questions/63101769
复制相似问题