SQL JOIN: ON против равных - PullRequest
18 голосов
/ 27 марта 2009

Есть ли существенная разница между следующим?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

И

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

Имеют ли пользователи SO предпочтение одному над другим?

Ответы [ 7 ]

24 голосов
/ 27 марта 2009

Нет никакой разницы, но читаемость второго намного лучше, когда у вас большой запрос с несколькими объединениями с дополнительными предложениями where для фильтрации.
Разделение предложений объединения и предложений фильтра - это хорошо:)

8 голосов
/ 27 марта 2009

Первый - это синтаксис ANSI 89, второй - ANSI 92.

Для этого конкретного запроса разницы нет. Однако в первом случае вы теряете возможность отделить фильтр от условия объединения в сложных запросах, и синтаксис, указывающий LEFT против RIGHT против INNER, часто сбивает с толку, особенно если вам приходится переходить от одного поставщика к другому. Мне совсем не нравится старый синтаксис.

4 голосов
/ 27 марта 2009

Нет никакой разницы для механизма запросов sql.

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

Для ВНУТРЕННИХ СОЕДИНЕНИЙ не имеет значения, если вы поместите «фильтры» и «объединения» в предложение «ON» или «WHERE», оптимизатор запросов должен решить, что делать в первую очередь (он может сначала выбрать фильтр, затем объединение или наоборот

Однако для ВНЕШНИХ СОЕДИНЕНИЙ есть разница, и иногда вы захотите поместить условие в предложение ON, иногда в WHERE. Помещение условия в предложение WHERE для OUTER JOIN может превратить его в INNER JOIN (из-за того, как работают NULL)

Например, проверьте читаемость между двумя следующими образцами:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

против

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 
1 голос
/ 27 марта 2009

Хотя технически нет никакой разницы, вам нужно быть особенно осторожным при выполнении объединений с использованием первого метода. Если вы случайно ошиблись, вы можете в итоге сделать декартово соединение между вашими таблицами a и b (очень длинный запрос памяти и процессора - он сопоставит каждую строку в a со всеми строками в b. Плохо, если a и б большие таблицы для начала). Использование явного INNER JOIN одновременно безопаснее и проще для чтения.

1 голос
/ 27 марта 2009

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

  1. Это текущий поддерживаемый стандарт
  2. Сохраняет объединения в предложении FROM и фильтры в предложении WHERE
  3. Это делает более сложным ЛЕВО, ПРАВО, ПОЛНОЕ ВНЕШНЕЕ объединение намного легче
  4. Справка MSSQL основана на этом синтаксисе, поэтому намного проще получить помощь по вашим проблемным запросам
0 голосов
/ 27 марта 2009

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

В остальном они одинаковы во всех отношениях по отношению к базам данных.

0 голосов
/ 27 марта 2009

Без разницы. Я считаю первый формат более читабельным и использую второй формат только при выполнении других типов объединений (OUTER, LEFT INNER и т. Д.).

...