我正在使用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
在上一个案例中。我还使用大括号试图在连接中强制一些优先级,但结果是相同的。
1条答案
按热度按时间eagi6jfj1#
连接从左到右求值。您的查询的操作顺序就好像您使用了如下括号:
因此它必须返回b中的所有行。
但它只返回(左连接cr)中匹配的行。联接的该部分将包括a中的所有行,但根据后续右联接的联接条件,可能会排除其中一些a行。
从你的描述来看,听起来你真的很想
FULL OUTER JOIN
. mysql不支持这种类型的外部连接。有几种方法可以通过使用两个连接的并集来模拟它:mysql支持完全外部连接的特性请求是在2006年提出的。如果您需要这个,您应该登录到bug跟踪器,并在该特性请求上单击“影响我”。