t-sql условие размещения - PullRequest
       35

t-sql условие размещения

0 голосов
/ 11 января 2011

Должен ли SQL Server давать одинаковые результаты для обоих приведенных ниже запросов?Основное отличие состоит в том, что условие помещается в предложение WHERE с первым, а последнее помещается в качестве условия на само соединение.

SELECT *
FROM cars c
INNER JOIN parts p
   ON c.CarID = p.CarID
WHERE p.Desc LIKE '%muffler%'

SELECT *
FROM cars c
INNER JOIN parts p
   ON c.CarID = p.CarID
   AND p.Desc LIKE '%muffler%'

Заранее благодарим за любую помощь, которую я получаю при этом!

Ответы [ 5 ]

1 голос
/ 11 января 2011

Для INNER JOINS это не будет иметь никакого значения для семантики или производительности. Оба дадут один и тот же план. Однако для OUTER JOIN s это имеет значение.

/*Will return all rows from cars*/
SELECT c.*
FROM cars c
LEFT JOIN parts p
   ON c.CarID = p.CarID AND c.CarID <> c.CarID


/*Will return no rows*/
SELECT c.*
FROM cars c
LEFT JOIN parts p
   ON c.CarID = p.CarID 
WHERE c.CarID <> c.CarID

Для внутренних соединений единственная проблема - ясность. Условие JOIN должно (IMO) содержать только предикаты, связанные с тем, как связаны две таблицы в JOIN. Другие несвязанные фильтры должны быть указаны в предложении WHERE.

0 голосов
/ 11 января 2011

Я бы порекомендовал для такой ситуации:

  • поставить условие JOIN (которое устанавливает "связь" между двумя таблицами) - и только это JOINусловие - после оператора JOIN

  • любые дополнительные условия для одной из двух соединяемых таблиц содержатся в обычном предложении WHERE

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

SELECT
     (list of columns)
FROM 
     dbo.cars c
INNER JOIN 
     dbo.parts p ON c.CarID = p.CarID
WHERE 
     p.Desc LIKE 'muffler%'

Это кажется «чище» и более выразительным - не «скрывайте» дополнительные условия за предложением JOINесли они на самом деле не принадлежат (например, помогите установить связь между двумя объединяемыми таблицами).

0 голосов
/ 11 января 2011

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

0 голосов
/ 11 января 2011

План выполнения будет идентичным в вашем примере. Рядом с кнопкой разбора должна быть кнопка «Показать план выполнения». Это даст вам более четкую картину.

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

РЕДАКТИРОВАТЬ: извините, если вы используете sql server management studio.

0 голосов
/ 11 января 2011

Для внутренних объединений два запроса должны давать одинаковые результаты.Вы видите разницу?

...