这些查询之间有什么区别
SELECT
A.AnyField
FROM
A
LEFT JOIN B ON B.AId = A.Id
LEFT JOIN C ON B.CId = C.Id
和另一个查询
SELECT
A.AnyField
FROM
A
LEFT JOIN
(
B
JOIN C ON B.CId = C.Id
) ON B.AId = A.Id
答案 0 :(得分:3)
原始答案:
它们不一样。
例如,即使没有c行,a left join b left join c
也会返回行,加上b行。
a left join (b join c)
将永远不会返回b行。
稍后添加:
SQL>create table a (id int);
SQL>create table b (id int);
SQL>create table c (id int);
SQL>insert into a values (1);
SQL>insert into a values (2);
SQL>insert into b values (1);
SQL>insert into b values (1);
SQL>insert into c values (2);
SQL>insert into c values (2);
SQL>insert into c values (2);
SQL>insert into c values (2);
SQL>select a.id from a left join b on a.id = b.id left join c on b.id = c.id;
id
===========
1
1
2
3 rows found
SQL>select a.id from a left join (b join c on b.id = c.id) on a.id = b.id;
id
===========
1
2
2 rows found
答案 1 :(得分:2)
第一个查询将从表a
获取所有记录,然后仅从表b
获取a.id
等于b.id
的记录。然后,它将从表c
中获取所有记录,其中表b
中的结果记录与cid
匹配c.id
。
第二个查询将首先在b
上加入c
和id
。也就是说,记录只会使b.CId
和c.ID
相同的联接的结果集,因为它是INNER JOIN
。
然后b INNER JOIN c
的结果将LEFT JOIN到表a
。也就是说,数据库将记录a
中的所有记录,并且仅记录b INNER JOIN c
a.id
等于b.id
不同之处在于,您可能会在第一个查询中收到来自b
的更多数据,因为数据库不会因为b.cid <> c.id
而从结果集中删除记录。
对于视觉,以下维恩图显示哪些记录可用
答案 2 :(得分:-1)
SELECT
A.AnyField
FROM
A
LEFT JOIN B ON B.AId = A.Id
LEFT JOIN C ON B.CId = C.Id
在这个查询中,你左边用C加入C,无论是否与C中的任何记录匹配,都可以为你提供B的所有记录。
SELECT
A.AnyField
FROM
A
LEFT JOIN
(
B
JOIN C ON B.CId = C.Id
) ON B.AId = A.Id
在此查询中,您使用B进行内部联接C,这将导致匹配B和C记录。
两个查询都会为您提供相同的结果集,因为您只从A中提取记录,因此您将看不到哪些记录匹配以及哪些记录没有与B和C相关。