2015-09-15 4 views
0
Way1: 
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid 
where a.condA = xx 
AND a.condB = xx 
AND a.condC = xx 

Way2: 
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid 
AND a.condA = xx 
AND a.condB = xx 
AND a.condC = xx 

Судя по вышеприведенному синтаксису, существуют ли существенные различия в сроках или характеристиках?SQL WHERE или ON для заявления о присоединении

+3

Проверьте планы выполнения, это так просто. Также оптимизатор запросов может генерировать один и тот же план для обоих, но, как всегда, это зависит. – lad2025

+1

И обратите внимание, что результат для обоих запросов будет другим, если вместо этого вы используете 'left join'. –

+0

Вы можете включить Планы выполнения в раскрывающемся списке Query. После выполнения запроса он покажет вам вычислительную стоимость каждой выполняемой операции и более подробную информацию при наведении курсора на значок. – jjjjjjjjjjj

ответ

1

Обычно СУБД должен генерировать один и тот же план выполнения.

Я считаю, что прежний (синтаксис JOIN) более очевиден, чем последний, поскольку он более ясен, чем вы занимаетесь.

+0

Это также стандартная форма ANSI (http://www.w3schools.com/ SQL/sql_quickref.asp) –

0

Номер Нет разницы.

Это не имеет значения в случае INNER JOIN, как с точки зрения производительности, так и результата.

В случае OUTER JOIN, положение условия делает разницу.

-1

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

Иногда во внутренних соединениях будет иметь значение, если условие приведет к преобразованию поля в другой тип. Если это так, могут возникать проблемы преобразования типов, которые мешают ему работать должным образом. Другими словами, если сравнение столбца с целым числом с столбцом строки и столбцом строки содержит «ТЕСТ», хорошо, что у вас будет плохое время. Если вы не исключите эти строки через условие соединения.

С точки зрения производительности вы хотите установить условия в соединении, которые попадут в индекс, который вы хотите использовать. Кроме того, они должны идти в разделе where, если они не нужны в соединении.

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

0

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

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