SQL JOIN: ON vs Equals

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

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 есть предпочтение друг от друга?

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Для INNER JOINs не имеет значения, помещаете ли вы "фильтры" и "присоединяетесь" в предложение ON или WHERE, оптимизатор запросов должен решить, что делать первым в любом случае (он может сначала выбрать фильтр, позже присоединиться, или наоборот

Однако для OUTER JOINs существует разница, и иногда вы хотите включить условие в предложение 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 

Ответ 4

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

  • Он поддерживает текущий стандарт
  • Он сохраняет соединения в предложении FROM и фильтрует в предложении WHERE
  • Это упрощает объединение LEFT, RIGHT, FULL OUTER
  • Справка MSSQL основывается на этом синтаксисе, поэтому гораздо проще получить помощь по вашим проблемным запросам.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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