Различные комбинации объединения сбивают с толку, кто-то может немного свалить? - PullRequest
3 голосов
/ 10 августа 2009

Глядя на JOIN в эти выходные.

Я читал на Join и увидел множество комбинаций JOIN, LEFT, RIGHT, OUTER, FULL, INNER. Я проверил документы MSDN, и похоже, что единственные допустимые комбинации имеют вид:

< join_type > ::=
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]
    [ < join_hint > ]
    JOIN

Итак, я полагаю, вы можете получить только:

JOIN / INNER JOIN
LEFT JOIN / LEFT OUTER JOIN
RIGHT JOIN / RIGHT OUTER JOIN
FULL JOIN / FULL OUTER JOIN

Кроме того, OUTER является необязательным ключевым словом, поэтому LEFT JOIN и LEFT OUTER JOIN действительно одинаковы. Это правильно? В чем разница между JOIN и FULL OUTER JOIN? Я видел только JOIN в скрипте, но не смог разбить его, потому что запрос был немного сложным.

Ответы [ 4 ]

4 голосов
/ 10 августа 2009

Существует только три вида объединения: CROSS, INNER и OUTER.

  • Перекрестные объединения возвращают каждую возможную комбинацию строк из обеих таблиц и используются не часто.
  • Внутренние объединения возвращают только те строки, в которых обе таблицы соответствуют условию соединения.
  • Внешние объединения выбирают одну таблицу в качестве исходной и всегда будут возвращать все строки из этой таблицы. Каждый раз, когда в другой таблице нет совпадений, предоставляются значения NULL.

Внутри внешних объединений (и только внешних объединений) есть также три подтипа: LEFT, RIGHT и FULL.

  • Для левых объединений первая таблица является исходной таблицей.
  • Для правых соединений 2-я таблица является исходной таблицей.
  • Для полных объединений обе таблицы являются исходными.

Поскольку LEFT, RIGHT и FULL применяются только к соединениям OUTER, иногда ключевое слово OUTER опускается, чтобы просто указать, какой тип внешнего соединения (т. Е. Просто «LEFT JOIN»).

1 голос
/ 10 августа 2009

Это все допустимые синтаксис, который может идти между источниками таблицы:

JOIN
INNER JOIN
LEFT JOIN
LEFT OUTER JOIN
RIGHT JOIN
RIGHT OUTER JOIN
FULL JOIN
FULL OUTER JOIN

Для каждого требуется следующее предложение ON.

Вы правы, что OUTER является необязательным, поэтому RIGHT JOIN - то же самое, что и RIGHT OUTER JOIN, а также для LEFT и FULL. Кроме того, INNER является необязательным, если его нет, поэтому JOIN совпадает с INNER JOIN.

Существует также CROSS JOIN, который совпадает с запятой и не имеет предложения ON. Другими словами,

FROM A CROSS JOIN B

и

FROM A,B

означает то же самое.

Операторы таблиц JOIN и FULL OUTER JOIN не одинаковы. Таблица источника

FROM A JOIN B ON <condition>

содержит только строки, для которых верно. С другой стороны, таблица источника

FROM A FULL OUTER JOIN B ON <condition>

содержит строки, для которых истинно вместе со всеми дополнительными строками, которые вы получите либо в LEFT OUTER JOIN, либо в RIGHT OUTER JOIN с тем же предложением ON.

1 голос
/ 10 августа 2009

У вас больше комбинаций, чем поддерживается:

<join_type> ::=
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]
    [ <join_hint> ]
    JOIN

Это говорит о том, что вы можете иметь:

       JOIN                    INNER JOIN
 LEFT  JOIN              LEFT  OUTER JOIN
 RIGHT JOIN              RIGHT OUTER JOIN
 FULL  JOIN              FULL  OUTER JOIN

Ключевое слово OUTER необязательно, другими словами. В полном стандарте SQL вы также можете иметь ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ или СОЕДИНЕНИЕ КРЕСТА. Ключевое слово INNER также необязательно; просто «ПРИСОЕДИНЯЙТЕСЬ» - ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

На самом деле, форматирование вашего ответа привело меня к мысли, что вы не поняли правильно; он запустил INNER JOIN с LEFT JOIN (я исправлю это в ближайшее время, если этого не сделает никто).

ПОЛНОЕ СОЕДИНЕНИЕ радикально отличается от простого (ВНУТРЕННЕГО) СОЕДИНЕНИЯ. INNER JOIN просто основан на указанном критерии (указанном предложением ON или предложением USING). LEFT OUTER JOIN состоит из строк INNER JOIN плюс те строки из левой таблицы, которые не соединены с правой таблицей, расширенной с помощью NULL для каждого столбца в правой таблице. Это иногда называют «левым внешним приращением». ПРАВИЛЬНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ меняет смысл внешнего соединения (поэтому существует «правое внешнее приращение»). ПОЛНОЕ СОЕДИНЕНИЕ состоит из объединения ВНУТРЕННЕГО СОЕДИНЕНИЯ и левого внешнего приращения и правого внешнего приращения. Результат FULL JOIN не имеет первичного ключа, потому что, как правило, в каждом столбце есть нули.

0 голосов
/ 10 августа 2009

Статья Википедии по SQL join довольно понятна и содержит множество примеров.

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