我有三张桌子:R,S和P.
表R通过外键与S连接;在S中应该有至少一个记录,所以我可以加入:
SELECT * FROM R JOIN S ON (S.id = R.fks)
如果在S中没有记录,那么我没有任何行,没关系.
然后表S加入P,其中记录是P可以或可能不存在并与S.
所以我做
SELECT * FROM R JOIN S ON (S.id = R.fks) LEFT JOIN P ON (P.id = S.fkp)
如果我想要将第二个JOIN绑定到S不是R,如果我可以使用括号,该怎么办?
SELECT * FROM R JOIN (S ON (S.id = R.fks) JOIN P ON (P.id = S.fkp))
还是R,S和P之间笛卡尔积分的自然行为?
解决方法
所有类型的外部和正常连接都位于相同的优先级中,并且操作符将在查询的给定嵌套级别从左到右生效.您可以将连接表达式放在右侧的括号中,使其首先生效;只要记住,你必须移动现在加入的连接的ON子句.
(Postgresql示例)
在SELECT * FROM a LEFT JOIN b ON(a.id = b.id)JOIN c ON(b.ref = c.id);
a-b加入首先生效,但是我们可以强制b-c加入,首先要做:
SELECT * FROM a LEFT JOIN(b JOIN c ON(b.ref = c.id))ON(a.id = b.id);
通常,您可以通过移动连接并改变外连接方向来表达相同的事情,而不需要额外的括号.
SELECT * FROM b JOIN c ON(b.ref = c.id)RIGHT JOIN a ON(a.id = b.id);