2014-10-27 6 views
2
SELECT 
    A.RowId 
FROM 
    dbo.Rows A 
    LEFT JOIN dbo.SpecialRows B ON A.RowId = B.RowId AND B.ExcludeRowId > 0 
WHERE 
    A.FileId = 55 
    AND A.Active = 1 
    AND A.ExcludeRowId = 0 
    AND B.RowId IS NULL /* This is to perform EXCEPT like operation */ 

Друзья, это мой запрос, и у меня есть несколько вопросов.SQL Left Join and Conditions

Q1) Предположим, у меня есть другой запрос, такой же, как этот, кроме первого 3, когда условия перемещаются в положение ON LEFT JOIN. Будет ли он генерировать одинаковый набор результатов?

Q2) В общем случае, если я использую LEFT JOIN, тогда все условия, связанные с правой таблицей (которая является dbo.SpecialRows в этом случае), должны быть в положении ON, это правильно?

Q3) Также, если я ставлю условия, связанные с левой таблицей (которая является dbo.Rows в этом случае) в выражении WHERE или ON, тогда набор результатов будет таким же, это правильно?

Пожалуйста, объясните, спасибо!

ответ

2

Вопрос 1

  • Нет, это будет иметь различный набор результатов.
  • вы получите все строки A и только строки B, где все условия соблюдены

Вопрос 2

  • Вообще-то да. Есть мнения, что, возможно, в некоторых случаях есть определенные случаи.
  • Если вы не будете осторожны, вы можете превратить LEFT JOIN в INNER JOIN, если вы поставили условие проверки значения в предложении WHERE без учета состояния NULL

Вопрос 3

  • См вопрос 1 ответ подробности
  • Если условия на А в WHERE, то вы получите только строки согласующего тех условий, независимо от воздействия B
  • Если условия на A в положении ON, то вы получите все строки A и th en только строки из B, соответствующие условиям в ON, даже если они только против A
+0

Я считаю, что вопрос 1 верен. Я настраиваю SQLFiddle, чтобы показать, как два сценария возвращают разные подсчеты строк - http://www.sqlfiddle.com/#!6/3d45b/5/0. –

+0

Urrp. Правильно ты, мой плохой ... – RBarryYoung