Когда я объединяю три или более таблиц по общему столбцу, я пишу запрос следующим образом:
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
Недавно коллега спросил меня, почему я не делаю явного Join Transitive Closure в своих запросах, например, так:
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
AND c.id = a.id
действительно ли в этом есть какие-то преимущества? Наверняка оптимизатор может сам это подразумевать?
edit: Я знаю, что это'дурной синтаксис, но это'быстрый и грязный пример легитимного унаследованного кода +1 @Stu за его очистку.
Вы don' t должен сделать это в сегодняшних ядрах базы данных, но было время, когда подобные вещи дадут оптимизатору вопроса больше намеков относительно возможных путей индекса и таким образом к более быстрым результатам.
В эти дни тот весь синтаксис выходит так или иначе.
Нет, этот синтаксис появился еще в те времена, когда в языке не было джойнов. Не знаю, какие проблемы с ним связаны, но определенно есть конструкции языка, которые лучше поддерживают объединение таблиц.
Я просто хочу сказать, что такое объединение - это работа дьявола.
Только подумайте, в операторе where смешиваются условия объединения и фильтрации.
Что произойдет, если вам нужно объединить 20 таблиц и отфильтровать 15 значений?
Опять же, просто мое мнение.
Если посмотреть на это с математической точки зрения, то ваши примеры должны дать одинаковые результаты.
a = b = c
Таким образом, первый пример даст те же результаты, что и второй, поэтому нет необходимости выполнять дополнительную работу.
Этот вопрос подобен этому здесь с очень всесторонним объяснением:
https://stackoverflow.com/questions/397089/sql-question-from-joel-spolsky-article
Короткий ответ, что явная декларация transitiv собственности может ускорить вопрос. Это вызвано тем, что оптимизация вопроса не тривиальная задача, и у некоторых SQL-серверов могли бы быть проблемы с нею.