2014-10-27 206 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左連接和條件

Q1)比方說,除了前3個條件移動到LEFT JOIN的ON子句之外,我還有另一個查詢與這個查詢相同。 它會生成相同的結果集嗎? Q2)一般情況下,如果我使用LEFT JOIN,那麼所有與右側表(這裏是dbo.SpecialRows)相關的條件必須在ON子句中,這是正確的嗎?

Q3)另外,如果我在WHERE子句或ON子句中放置與左側表(這是dbo.Rows)有關的條件,那麼結果集將是相同的,這是正確的嗎?

請解釋一下,謝謝!

回答

2

問題1

  • 沒有,就會產生不同的結果集。
  • 你會得到所有的條件都滿足

問題2

  • 通常是在A的所有行和僅B的行。有意見認爲,否則可能有某些情況。
  • 如果你不小心,你可以把一個LEFT JOIN成一個內圈,如果你把一個條件檢查WHERE子句中不佔NULL條件

問題3

    值JOIN
  • 見問題1回答有關詳細信息,
  • 如果在條件在何處,那麼你只能得到一個匹配的行這些條件,無論B的影響
  • 如果在條件處於開啓,那麼你得到的所有行A和th只有B行與ON中的條件相匹配,即使它們僅針對A
+0

我相信問題1是正確的。我設置了一個SQLFiddle來顯示2個場景如何返回不同的行數 - http://www.sqlfiddle.com/#!6/3d45b/5/0。 – 2014-10-27 17:29:17

+0

Urrp。對,你是我的壞人 – RBarryYoung 2014-10-27 17:32:34