SQL Левое внешнее соединение при размещении предложения

#sql

#sql

Вопрос:

Сегодня мне сообщили, что предложение ON для левого внешнего соединения фактически определяет, какая таблица является левой или правой. Когда я смотрю на это, я на самом деле не вижу никаких различий в результатах, если я перемещаю ключ слева или справа в предложении ON. Я также посмотрел на technet, но я не могу найти никакой документации по этому поводу.

Действительно ли размещение ключей в предложении ON определяет, какая таблица находится слева или справа, и приведет ли это к разным наборам результатов?

Например:

 SELECT *
FROM Product p
LEFT OUTER JOIN Review r ON p.ProductKey = r.ProductKey


SELECT *
FROM Product p
LEFT OUTER JOIN Review r ON r.ProductKey = p.ProductKey
 

Комментарии:

1. нет. но это может быть фактором производительности для некоторых СУБД.

2. @Sanka: нет современной СУБД, где это имело бы значение

3. Вам сообщили неверно. Ваши два запроса эквивалентны — стандарт ANSI, поэтому результирующие наборы одинаковы. Трудно представить компилятор SQL, который мог бы создавать разные планы для двух запросов..

Ответ №1:

По сути, таблица, которую вы перечисляете в FROM предложении, является «левой стороной» запроса, а любые таблицы, которые вы перечисляете в JOIN предложении, являются «правой стороной».

 SELECT ...
FROM lefttable
JOIN righttable ON ...
 

а затем ключевое слово left / right join определяет, КАКАЯ из этих двух таблиц используется:

все «левые» записи с ЛЮБЫМИ доступными «правильными» записями:

 SELECT
FROM lefttable
LEFT JOIN righttable ON ...
 

все «правильные» записи с ЛЮБЫМИ доступными «левыми» записями:

 SELECT ...
FROM lefttable
RIGHT JOIN righttable ON ...
 

Замена правой / левой семантики делает по существу тот же запрос:

 SELECT ... FROM lefttable  RIGHT JOIN righttable ON ...
SELECT ... FROM righttable LEFT JOIN  lefttable ON ...