«Вкл.» Левый порядок соединения - PullRequest
1 голос
/ 27 марта 2019

Я прочитал более 20 постов с похожим названием, но не смог найти ответ, поэтому заранее извиняюсь, если таковой имеется.

Я всегда верил, что

select * FROM A LEFT JOIN B on ON A.ID = B.ID

было эквивалентно

select * FROM A LEFT JOIN B on ON B.ID = A.ID

но сегодня было сказано, что "поскольку у вас есть левое соединение, вы должны иметь его как A = B, потому что перевернутое соединение будет действовать как внутреннее соединение.

Есть ли правда в этом?

Ответы [ 3 ]

5 голосов
/ 27 марта 2019

Тот, кто сказал вам, что не понимает, как работают СОЕДИНЕНИЯ и условия соединения.Он / она совершенно не прав.

Порядок таблиц имеет значение для левого соединения.a left join b отличается от b left join a, но порядок соединения условие не имеет смысла.

3 голосов
/ 27 марта 2019

A.ID = B.ID - это условие, при котором таблицы объединяются и возвращает TRUE или FALSE.
Поскольку равенство (=) равно коммутативно , порядок операндов не влияет на результат.

1 голос
/ 27 марта 2019

Они абсолютно неверны, и доказать это просто.

DECLARE @A TABLE (ID INT)
DECLARE @B TABLE (ID INT)

INSERT INTO @A(ID) SELECT 1
INSERT INTO @A(ID) SELECT 2

INSERT INTO @B(ID) SELECT 1

SELECT *
FROM @A a
LEFT JOIN @B b ON a.ID=b.ID

SELECT *
FROM @A a
LEFT JOIN @B b ON b.ID=a.ID

Порядок таблиц имеет значение (A слева JOIN B против B LEFT JOIN A), порядок группы условий соединения имеет значение, если используется OR (A = B OR A NULL и A NOT NULL - всегда используйте круглые скобки с ИЛИ), но в группе условий (например, a.ID = b.ID) это не имеет значения.

...