LEFT JOIN形式之间的差异

时间:2015-04-13 14:25:46

标签: sql

这些查询之间有什么区别

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

3 个答案:

答案 0 :(得分:3)

原始答案:

它们不一样。

例如,即使没有c行,a left join b left join c也会返回行,加上b行。

如果没有c行,

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上加入cid。也就是说,记录只会使b.CIdc.ID相同的联接的结果集,因为它是INNER JOIN

然后b INNER JOIN c的结果将LEFT JOIN到表a。也就是说,数据库将记录a中的所有记录,并且仅记录b INNER JOIN c a.id等于b.id

的结果中的记录

不同之处在于,您可能会在第一个查询中收到来自b的更多数据,因为数据库不会因为b.cid <> c.id而从结果集中删除记录。

对于视觉,以下维恩图显示哪些记录可用

enter image description here

答案 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相关。