#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 ...