我正在尝试在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
答案 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')`