我试图在t-sql中运行查询,以根据列为null的列撤回数据集。
这是代码的简化版本:
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且不为空的行,就像该子句不存在。
任何想法都将是极大的
更新 - 代码的完整版本:
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个表之间返回匹配。尝试完整的外部连接,无论匹配项如何,它都会返回所有值,并将包括nulls。
如果您想返回所有行,无论比赛中只有一个表格包括一个表格,则使用右或向左加入。
说我有2个表("人"one_answers"数字")。并非每个人在任何一天都可能进入一个数字。但是一个例子可能是我想退还所有人,无论他们在某个一天是否进入数字。
我对此的最初方法将是左加入,因为我想返回所有人(左表),无论是在图表中有任何匹配项(右表)
FROM Person P
LEFT JOIN Figure F
ON P.ID = F.ID
这将产生
之类的结果 Name Figure
Sam 20
Ben 30
Matt NULL
Simon NULL
,而
内部连接只会产生不包括nulls
的匹配值 Name Figure
Sam 20
Ben 30
左联接的工作方式与右连接相同,但朝相反的方向。这很可能是您面临的问题。但我希望这对
我认为问题是在其中的最后部分。您应该使用括号。
`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')`