2012-06-28 6 views
3

Итак, мы переходим от Informix к серверу Sql. И я заметил, что в Informix запросы записываются таким образом:Какой синтаксис для соединения лучше?

select [col1],[col2],[col3],[col4],[col5] 
from tableA, tableB 
where tableA.[col1] = table.[gustavs_custom_chrome_id] 

Принимая во внимание все вопросы, которые я пишу в SQL Server записываются в виде:

select [col1],[col2],[col3],[col4],[col5] 
from tableA 
inner join tableB on tableA.[col1] = table.[gustavs_custom_chrome_id] 

Теперь, моя первая мысль была: что первый запрос плохой. Вероятно, это создает этот огромный набор записей, а затем стирает фактический набор записей, используя предложение Where. Поэтому это плохо для производительности. И это не-анси. Так что это вдвойне плохо.

Однако, после некоторых поисковых запросов, похоже, что они оба теоретически почти одинаковы. И они оба совместимы с ANSI.

Так что мои вопросы:

  1. ли оба запроса выполнить то же самое? IE. работает так же быстро и всегда дает тот же ответ.
  2. Оба действительно совместимы с ANSI?
  3. Есть ли какие-либо выдающиеся причины, по которым я должен настаивать на одном стиле над другим? Или я должен просто оставить достаточно одного?


    Примечание: Это только примеры запросов. Я видел, что некоторые запросы (первого типа) объединяют до 5 таблиц за раз.
+0

Возможный дубликат [Какой из них лучше в SQL?] (Http://stackoverflow.com/questions/3212174/which-one-is-better-in-sql) – spender

+0

См. Хороший пост об этом здесь: http : //sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+3

@spender Ну, этот вопрос, который вы связали, закрылся как «не реальный вопрос ». Итак, вы говорите, что мой вопрос «не настоящий вопрос»? Потому что я определенно не соглашусь с этим. – dotnetN00b

ответ

16

Ну, «лучше» субъективно. Здесь есть какой-то стиль. Но я буду решать ваши вопросы напрямую.

  1. Оба выполняют так же
  2. Оба ANSI-совместимыми.
  3. Проблема с первым примером является то, что

    • очень легко непреднамеренно получить декартово произведение (так как легче выйти из присоединиться к критериям)

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

    • поскольку синтаксис внешнего соединения в старом стиле (* =) устарел (it has long been documented to return incorrect results), когда вам нужно ввести внешние соединения, вам нужно t o смешивать новый стиль и старинный стиль ... зачем способствовать несогласованности?

    • пока он точно не авторитет передовой практики, Microsoft recommends explicit INNER/OUTER JOIN syntax

    • с последним методом:

      • вы используете последовательным синтаксис объединение, независимо от внутреннего/внешнего
      • это сложнее (не невозможно) случайно получить перекрестный продукт
      • изолирование критериев присоединения по критериям фильтра может облегчить отладку

Я написал the post Kevin pointed to.

+0

Также старое соединение слева от стиля может быть неверно истолковано SQL Server даже в SQL Server 2000. См. Книги в Интернете. – HLGEM

+0

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

+0

Я знаю, что ты не был. Я также заметил, что возникают проблемы, возникающие при объединении разбора и неявного синтаксиса (план выполнения может привести вас к корсу, присоединяющему их, когда он не будет иметь все неявные объединения), поэтому, как минимум, все левые запросы на соединение должны быть написанный в явном синтаксисе. Лично я думаю, что, будучи замененным 20 лет назад, это непростительно, что люди по-прежнему используют неявный синтаксис. – HLGEM

Смежные вопросы