2015-12-18 31 views
3

這是一個尷尬的問題!但是我現在還沒有使用tsql一段時間。爲什麼我的內部連接不起作用

我有3個表:

  • 工作
  • 畫廊
  • JobWorkUnit

Gallery主鍵鏈接到相應的外鍵Job。主鍵JobWorkUnit鏈接到相應的外鍵Job

我希望返回Job上的所有記錄,而不管它們在其他2個表中是否有'鏈接'。

我以爲用LEFT OUTER JOIN就是這樣做的,但是我根本沒有得到任何記錄。

有人可以檢查我的代碼嗎?

SELECT 
    * 
FROM 
    Job J 
LEFT OUTER JOIN 
    Gallery G ON G.JobRef = J.JobRef 
LEFT OUTER JOIN 
    JobWorkUnit JWU ON J.JobRef = JWU.JobRef 
WHERE 
    J.Active = 1 
    AND G.Active = 1 
    AND JWU.Active = 1 
    AND J.CompanyRef = @CompanyRef 

有在WorkUnitGallery

沒有記錄,如果我刪除:

AND G.Active = 1 
AND JWU.Active = 1 

我得到2條回來,我Where子句重寫我的連接類型。這是一個公平的事情嗎?

+1

'job'中是否有任何行?你有'where'條款嗎?爲什麼標題詢問內部連接? –

+0

@MartinSmith感謝您的評論。是的,Jobin中有definatley行:)。我已經測試它沒有使用連接,我得到2記錄返回 –

+0

但是,我確實有一個Where的原因,這就是這種情況,所以Iwill編輯我的問題。謝謝讓我關注:) –

回答

2

這只是一個風格/清晰度的問題,但我p請不要在連接條件中過濾數據。我想這樣重寫查詢:

SELECT 
* 
FROM 
    Job J 
Left OUTER JOIN Gallery G 
ON 
    G.JobRef = J.JobRef 
LEFT OUTER JOIN JobWorkUnit JWU 
ON 
    J.JobRef = JWU.JobRef 
WHERE 
    J.Active = 1 
AND 
    (G.Active = 1 OR G.Active IS NULL) 
AND 
    (JWU.Active = 1 OR JWU.Active IS NULL) 
AND 
    J.CompanyRef = @CompanyRef 

就個人而言,我認爲表達了查詢的意圖最清楚。

編輯: 就意識到,實際上沒有人明確地解釋爲什麼

當您執行外連接時,外連接的表的字段在沒有連接時爲空。如果您接着使用WHERE子句中的那些字段,則它們將失敗所有過濾條件(當然除外IS NULL),就像空值一樣。

+0

剛回來。感謝您的回答。請給我幾分鐘消化。謝謝:) –

+2

並與此查詢您成功地不使用可能的索引。更好地結合那些''或活動是空' –

+0

@GiorgiNakeuri我認爲你的評論擺在我這裏 –

2

這個查詢將返回零個結果只有在job表是空

修訂:顯示where

SELECT * 
FROM Job J 
    left join Gallery G ON J.JobRef = G.JobRef 
     and G.Active = 1 
    left join JobWorkUnit JWU on J.JobRef = JWU.JobRef 
     and JWU.Active = 1 
where J.Active = 1 
    and J.CompanyRef = @CompanyRef 
+0

剛剛回來。感謝您的回答。請給我幾分鐘消化。謝謝:) –

+0

我甚至沒有意識到我可以做到這一點。 –

+0

我現在必須決定是否將過濾放入連接中或者我不確定。只要 –

5

你應該將過濾,加入的條件,其他的方式你只是過濾掉具有空值的行:

SELECT * 
FROM Job J 
     LEFT OUTER JOIN Gallery G ON G.JobRef = J.JobRef 
            AND G.Active = 1 
     LEFT OUTER JOIN JobWorkUnit JWU ON J.JobRef = JWU.JobRef 
              AND JWU.Active = 1 
WHERE J.Active = 1 
     AND J.CompanyRef = @CompanyRef 
+0

剛回來,我會盡快接受答案。感謝您的回答。請給我幾分鐘消化。謝謝:) –

+0

我甚至沒有意識到我可以做到這一點。 –

+0

我現在要決定是否將過濾放入連接中或者我不確定。我會盡快接受答案 –

相關問題