Каковы преимущества явного соединения с транзитивным закрытием в 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 за его очистку

4 sql
14.08.2008 13:44:43
8 ОТВЕТОВ
РЕШЕНИЕ

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

В наши дни весь этот синтаксис в любом случае исчезает.

4
14.08.2008 13:53:33

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

2
14.08.2008 13:46:23

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

а = б = с

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

1
3.11.2013 09:15:43

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

Опять же, только мои $ .02

1
14.08.2008 13:50:39

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

1
14.08.2008 13:51:24

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

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
4
14.08.2008 14:30:39

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

-1
14.08.2008 17:46:36
Вы можете сделать это в обычном синтаксисе соединения FROM table1 t1. ПРИСОЕДИНЯЙТЕСЬ к таблице 2 t2 на t1.field1 = t2.field1 и t.field2 = t2.field2
HLGEM 20.04.2009 14:41:55

Этот вопрос похож на этот здесь с очень глубоким объяснением:

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

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

0
23.05.2017 11:55:16