IS NULL被忽略

时间:2017-09-27 09:22:20

标签: sql-server tsql null

我正在尝试在T-SQL中运行查询,以根据列为空来撤回数据集。

这是代码的简化版本:

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

2 个答案:

答案 0 :(得分:0)

我的第一个答案是因为你正在使用INNER JOIN。这只返回2个表之间的匹配。 TRY FULL OUTER JOIN将返回所有值而不管匹配,并包括NULLS。

如果您想要返回所有行,而不管其中一个表中包含NULLS的匹配项,则使用RIGHT或LEFT JOIN。

说我有2张桌子('人'和'图')。并非每个人都可以在任何一天进入数字。但是一个例子可能是我想让所有人回归,无论他们是否在某一天进入了一个人物。

我最初的方法是左边连接,因为我想要返回所有人(左表)而不管图表中是否有任何匹配(右表)

    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

左连接的工作方式与右连接的工作方式相同,但方向相反。这很可能是您遇到的问题。但我希望这有助于

答案 1 :(得分:0)

我认为问题出在where条件的最后部分。 你应该使用括号。

`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')`