我有三张桌子:R,S和P.
表R通过外键与S连接; 有应该是S中至少一个的记录,所以我可以加入:
SELECT
*
FROM
R
JOIN S ON (S.id = R.fks)
Run Code Online (Sandbox Code Playgroud)
如果在S中没有记录,那么我没有行,这没关系.
然后表S与P连接,其中记录是P可能存在也可能不存在并且与S连接.
所以我这样做
SELECT
*
FROM
R
JOIN S ON (S.id = R.fks)
LEFT JOIN P ON (P.id = S.fkp)
Run Code Online (Sandbox Code Playgroud)
如果我想将第二个JOIN绑定到S而不是R,如果我可以使用括号,该怎么办?
SELECT
*
FROM
R
JOIN (S ON (S.id = R.fks) JOIN P ON (P.id = S.fkp))
Run Code Online (Sandbox Code Playgroud)
或者这是R,S和P之间笛卡尔积的自然行为?
rak*_*ice 37
所有类型的外连接和普通连接都在相同的优先级类中,并且运算符在查询的给定嵌套级别从左到右生效.您可以将连接表达式放在括号中的右侧,以使其首先生效; 只记得你必须移动ON现在在你加入parens的连接之外的连接的子句.
(PostgreSQL示例)
在 SELECT * FROM a LEFT JOIN b ON (a.id = b.id) JOIN c ON (b.ref = c.id);
ab join首先生效,但是我们可以通过将它放在括号中来强制bc join首先生效,如下所示:
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);