2017-09-27 291 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')`