如何混合使用交叉引用的左右联接 table
How to mix left and right joins with cross reference table
我正在使用 Mysql。
我有 table A(ida)
和 table B(idb)
和交叉引用 table CR(ida, idb)
.
我想在查询中捕获 A
和 B
之间的关系(基本上是 CR
),但我还想要 A
和 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
。我还使用大括号尝试在联接中强制执行某些优先级,但结果是一样的。
联接是从左到右求值的。您的查询的操作顺序就好像您使用了这样的括号:
(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 年提交。如果您需要这个,您应该登录错误跟踪器并在该功能请求上单击“影响我”。
我正在使用 Mysql。
我有 table A(ida)
和 table B(idb)
和交叉引用 table CR(ida, idb)
.
我想在查询中捕获 A
和 B
之间的关系(基本上是 CR
),但我还想要 A
和 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
。我还使用大括号尝试在联接中强制执行某些优先级,但结果是一样的。
联接是从左到右求值的。您的查询的操作顺序就好像您使用了这样的括号:
(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 年提交。如果您需要这个,您应该登录错误跟踪器并在该功能请求上单击“影响我”。