Каковы преимущества явного транзитивного замыкания соединения в SQL?

Когда я объединяю три или более таблиц вместе общим столбцом, я бы написал свой запрос следующим образом:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

коллега недавно спросил меня, почему я не использовал явное переходное закрытие присоединения в своих таких запросах:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

действительно ли в этом есть какие-то преимущества? Неужто оптимизатор может подразумевать это для себя?

изменить: я знаю, что это злой синтаксис, но это быстрый и грязный пример законного устаревшего кода +1 @ Stu для его очистки

Ответов (8)

Решение

В современных СУБД этого делать не нужно, но было время, когда подобные вещи давали оптимизатору запросов больше подсказок относительно возможных путей индекса и, следовательно, более быстрых результатов.

В наши дни весь этот синтаксис все равно выходит.

Если вы посмотрите на это с математической точки зрения, ваши примеры должны дать те же результаты.

а = б = с

Таким образом, ваш первый пример даст те же результаты, что и второй, поэтому нет необходимости выполнять дополнительную работу.

В Microsoft SQL планы запросов для этих двух запросов идентичны - они выполняются одинаково.

Этот вопрос похож на этот с очень подробным объяснением:

Вопрос SQL из статьи Джоэла Спольски

Короткий ответ заключается в том, что явное объявление свойства transitiv может ускорить запрос. Это связано с тем, что оптимизация запросов - нетривиальная задача, и некоторые серверы SQL могут иметь с ней проблемы.

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

Я просто хочу сказать, что такое объединение - дьявольская работа.
Просто подумай об этом; условия объединения и фильтрации смешиваются в операторе where.
Что происходит, когда вам нужно объединить 20 таблиц и отфильтровать 15 значений?

Опять же, только мои 0,02 доллара

Это грязный, злой унаследованный синтаксис. Вы пишете это как

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

Однако этот синтаксис имеет свое применение ... бывают случаи, когда вы обнаруживаете, что вам нужно объединить две таблицы более чем в одном поле.