В чем разница между стандартным INNER JOIN и INNER JOIN INNER JOIN? - PullRequest
0 голосов
/ 22 мая 2018

Может кто-нибудь объяснить, пожалуйста, разницу между этим:

SELECT * FROM A
INNER JOIN B ON ...
INNER JOIN C ON ...

И этим:

SELECT * FROM A
INNER JOIN B INNER JOIN C ON ... ON ...

Пример:

SELECT A.Something, B.Something, C.Something
INTO #TempTable
FROM TableA A
INNER JOIN TableB B
    INNER JOIN TableC C ON C.FK = B.PK
ON A.JoinField = B.ID

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

JOIN s не всегда между таблицами .Они часто находятся между предыдущими результатами JOIN s .Поэтому важно объединить order .

В первом запросе мы соединяем таблицу A с таблицей B.В первом предложении ON мы можем ссылаться только на таблицы A или B.Допустим, это дает результат, который мы неофициально назовем A_B.Второе соединение происходит между A_B и C.Второе предложение ON может содержать ссылки на A, B или C, но следует понимать, что ссылки A или B на самом деле являются ссылками на результат A_B, полученный первым JOIN.

Во втором запросе мы сначала соединяем таблицу B с таблицей C.В этом первом предложении ON (которое относится к предложению second JOIN) мы можем ссылаться только на таблицы B или C.Мы назовем этот результат B_C.Второе предложение ON затем завершило first JOIN, соединив A с B_C, и это второе предложение ON может снова ссылаться на A, B или C,но на этот раз B или C являются ссылками на B_C. 1

Самый ясный способ визуализировать, как соотносятся предложения JOIN и ON, - это обрабатыватьJOIN так же, как и открывающая скобка, и ON, как если бы это была закрывающая скобка.Затем соответствующие круглые скобки указывают, какие ON s сопоставлены с каким JOIN, а вложенность говорит вам, в каком порядке объединения происходят.


1 Хотя эти различия не так важны, когда используются только INNER объединений и когда каждое ON фактически ссылается только на одну из двух таблиц.

0 голосов
/ 22 мая 2018

Результаты будут такими же.
Если в любом случае используется только INNER JOIN.

Но первый способ - это стандартный и правильный способ сделать это.
Это более читабельно и менее запутанно.

Как это влияет на план объяснения?Это зависит от базы данных.
SQL - декларативный язык.Где мы спрашиваем, что мы хотим, а не как вытащить это.
(по крайней мере, если вы не используете T-SQL подсказки )

ВотПример T-SQL, чтобы продемонстрировать, что результаты совпадают.

declare @A table (ID_A int, FK_B int);
declare @B table (ID_B int, FK_C int);
declare @C table (ID_C int);
insert into @A (ID_A, FK_B) values (11,21),(12,22),(13,null);
insert into @B (ID_B, FK_C) values (21,null),(22,32),(23,33);
insert into @C (ID_C) values (31),(32),(33);

-- A to B, B to C
select a.ID_A, b.ID_B, c.ID_C
from @A a
inner join @B b on (b.ID_B = a.FK_B)
inner join @C c on (c.ID_C = b.FK_C);

-- (B to C) to A
select a.ID_A, b.ID_B, c.ID_C
from @A a
inner join @B b inner join @C c on (c.ID_C = b.FK_C) 
on (b.ID_B = a.FK_B); 

Оба результата:

ID_A ID_B ID_C
---- ---- ----
12   22   32
0 голосов
/ 22 мая 2018

С INNER JOIN разницы нет.Разница в том, когда в игру входит OUTER JOIN.

Допустим, у вас есть следующие столы:

Стол A:

ID          BID
----------- -----------
1           1
2           NULL
3           2

Стол B:

ID          BVAL
----------- ----------
1           X
2           Y

Таблица C:

BID         CVAL
----------- ----------
1           ABC

Если вы затем запросите

SELECT * FROM A
   LEFT OUTER JOIN B
      ON B.ID = A.ID
   INNER JOIN C
      ON C.BID = B.ID

, вы получите ровно одну запись:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC

, но этот запрос

SELECT * FROM A
   LEFT OUTER JOIN B
      INNER JOIN C
         ON C.BID = B.ID
      ON B.ID = A.ID

даст три:

ID          BID         ID          BVAL       BID         CVAL
----------- ----------- ----------- ---------- ----------- ----------
1           1           1           X          1           ABC
2           NULL        NULL        NULL       NULL        NULL
3           2           NULL        NULL       NULL        NULL

Итак, как вы можете видеть, вложенное JOIN оценивается раньше другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...