2016-03-15 138 views
-1

我有這個疑問:Case語句中JOIN

Select b.building_pk, bil.building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 

它工作正常。但是我想在bil.building_fkbil.BillingAccountStatus_fk列的結果集中覆蓋NULL s,因爲Billing tbl中的所有內容都不存在於建築物表格中。

所以寫下面的查詢,但得到這個錯誤信息。

消息102,級別15,狀態1,行7'='附近語法不正確。

請協助。

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock) 
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil (nolock) ON 
CASE 
    WHEN bil.building_fk IS NOT NULL 
     THEN bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk 
    WHEN bil.building_fk IS NULL 
     THEN bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing' 
    END 
ORDER BY b.building_pk; 
+4

您的邏輯多個錯誤,如'= NULL'。 –

+4

CASE不是一個聲明,它是一個函數/表達式。它應該返回一個值,而不是嘗試賦值。 – RBarryYoung

+0

您不能使用這種情況下的表達式。你在這裏有很多問題很難解決所有問題。全局臨時表。由於併發問題,這些問題非常嚴重。你有NOLOCK亂丟一切。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/你有條件檢查列= NULL。這不起作用,因爲Nothing = NULL。那些需要使用ISNULL或COALESCE, –

回答

1

很難說出你想要做什麼,因爲它是非常錯誤的。不過,我認爲你要保持你的FROM一致,並將CASE聲明放到SELECT中。

Select b.building_pk, CASE WHEN bil.Building_fk IS NULL THEN 'Not in Billing' ELSE bil.building_fk END as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 

或者,更好的是,使用COALESCE()這裏:

Select b.building_pk, COALESCE(bil.Building_fk,'Not in Billing') as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 
+0

感謝您的解決方案。但是目標是在bil.Building_fk爲NULL時替換列bil.BillingAccountStatus_fk中的NULL。 – enigma6205

+0

然後將該案例聲明移至該字段並翻轉該Else以指向該其他字段。 – JNevill

0

CASE表達式不能被用來設置您使用的JOIN標準,他們可以比較的任何一側運營商JOIN標準,但我不認爲你需要,我認爲你只需要在LEFT JOINCOALESCE()SELECT

SELECT b.building_pk 
    , bil.building_fk As [BLD Key from Billing] 
    , COALESCE(bil.BillingAccountStatus_fk,'Not in Billing') 
    , b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b 
join ##GlobalTempTable1 tt 
    ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil 
    ON bil.building_fk = b.building_pk 
ORDER BY b.building_pk; 

編輯:注意力BillingAccountStatus_fk來自bil兩側,所以從JOIN標準中刪除。

+0

目標是在bil.Building_fk爲NULL時替換列bil.BillingAccountStatus_fk中的空值 – enigma6205

+0

這就是查詢所做的事情:'COALESCE()'返回集合中的第一個非空值,在這種情況下,如果是'bil。BillingAccountStatus_fk'爲空它返回'Not in Billing' –

0

我猜測你正在嘗試做這樣的事情:

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock) 
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil (nolock) ON 
    (bil.building_fk IS NOT NULL AND 
     (bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk)) 
    OR (bil.building_fk IS NULL AND 
     (bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing')) 
ORDER BY b.building_pk; 

我將離開誤導使用nolock另一天...

+0

我意識到與nolock使用有關的問題,但是我在prod中工作,所以我被要求在沒有放置nolock的情況下不會運行任何東西.... – enigma6205

+0

我試過您的查詢和它已成功執行,但在bil.BillingAccountStatus_fk列中的NULL未被替換...我是否需要將「bil.building_fk = NULL」中的「=」替換爲「bil.building_fk IS NULL」?剛試過用「IS NULL」沒有幫助NULL替換。 – enigma6205