2017-09-27 289 views
-2

我想在T-SQL中運行一個查詢來取回基於列爲空的數據集。IS忽略被忽略

這是代碼的簡化版本:

SELECT 
    T1.Col1, T1.Col2, 
    T1.Col3, T1.Col4 
FROM 
    table1 AS T1 
INNER JOIN 
    table2 AS T2 ON T1.Col2 = T2.Col3 
WHERE 
    T2.Col4 IS NULL 

問題是,所述結果包括其中T2.Col4是NULL,也不是NULL的行,這就像WHERE子句不存在。

任何想法將大大

更新 - 代碼完整版:

SELECT 

    M.ref      
    ,C.cname        
    ,CL.clname       
    ,C.ccity        
    ,M.productLine      
    ,M.code       
    ,CL.date 
    ,M.dept 
    ,DPT.group 
    ,TK2.tkname 
    ,TK2.tkdept 


FROM DB.dbo.manage AS M 

     OUTER JOIN DB.dbo.ClientManageRelationship AS CMR 
     ON CMR.RelatedEntityID = M.EntityID 

     OUTER JOIN DB.dbo.Client AS C 
     ON C.EntityID = CMR.EntityID 

     INNER JOIN DB.dbo.ManageCustomerRelationship AS MCR 
     ON MCR.EntityID = M.EntityID 

     INNER JOIN DB.dbo.Customer AS CL 
     ON CL.EntityID = MCR.RelatedID 

     INNER JOIN DB.dbo.timek AS TK 
     ON TK.tki = M.tkid 

     LEFT JOIN (SELECT Group = division, [Department] = newdesc, deptcode FROM DB.csrt.vw_rep_p_l_dept) AS DPT 
     ON tkdept = DPT.dept 

     LEFT JOIN (SELECT Name = TK2.tkfirst + ' ' + TK2.tklast, TK2.tki, TK2.dept, TK2.loc FROM DB.dbo.timek as TK2 WITH(NOLOCK)) AS TK2 
     ON TK2.tki = M.tkid 


    WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc = 'loc1' OR TK.tkloc = 'loc2' 

ORDER BY M.ref 
+1

你確定嗎?可以將T2.Col4添加到您的選擇和發佈樣本數據和輸出(以文本表格格式)? – etsa

+1

當你運行沒有where的查詢時,你會得到NULLS嗎? –

+0

對不起,我應該更清楚。 T2Col4也被選中,所以我可以看到結果。我已經取出where子句,我得到了NULLS和NOT NULLS,但是我得到了一個沒有WHERE子句的更大的結果集。此外,還有更多的連接比我的示例代碼中,我不知道這是否有所作爲? – mark

回答

0

我的第一個答案是,因爲你使用INNER JOIN。這隻會返回2個表格之間的匹配。 TRY FULL OUTER JOIN將會返回所有值,無論匹配是否包含NULLS。

如果您希望返回所有行,而不考慮包括NULLS在內的其中一個表的匹配,則使用右或左連接。

說我有2個表('人'和'圖')。並非每個人在任何一天都可能輸入數字。但是,我可以舉一個例子,不管他們是否在某一天輸入數字,都要返回所有人。

我對這個最初的方法將是一個LEFT JOIN,因爲我想回到所有的人(左表),無論有是圖中的表中的任何比賽(右表)

FROM Person P 
    LEFT JOIN Figure F 
    ON P.ID = F.ID 

這會的產生結果如

 Name  Figure 

     Sam  20 
     Ben  30 
     Matt  NULL 
     Simon  NULL 

然而,

內連接將產生唯一匹配的值不包括空值

 Name  Figure 

     Sam  20 
     Ben  30 

左連接的工作方式與右連接相同,但方向相反。這很可能是你面臨的問題。但我希望這有助於

+0

謝謝瑞恩。這確實產生了正確的結果,但我不明白INNER JOIN的問題。 INNER JOIN不應該只顯示連接列上有匹配並且子句列中有NULL的結果? – mark

+0

很難說完全沒有看到你的表結構,但我會嘗試添加一個例子到我的答案,可能會幫助 –

+0

我會添加完整的代碼,而不是一小部分,這可能會有所幫助。 – mark

0

我認爲問題是在哪裏條件的最後部分。 你應該使用括號。

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND (TK.tkloc = 'loc1' OR TK.tkloc = 'loc2')` 

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc IN ('loc1', 'loc2')`