我有一个很长的查询,在某些时候,我有这个:
LEFT OUTER JOIN T1 ON T1.ID = T2.ID
由于我的查询结果不正确(行数太多),我正在研究它,当我尝试这个时:
LEFT OUTER JOIN (SELECT * FROM T1) T1 ON T1.ID = T2.ID
然后得到了我想要的东西。我想知道为什么这两行给出不同的结果。有人可以向我解释一下吗?
P.S。我使用的是SQL Server 2008。
编辑2:我发布了video on YouTube来显示问题。
编辑1:这是显示问题的完整最小查询:
SELECT
Project.ProjectID,
Contract.ContractID,
BookletStatus.PrintStatusID AS StatusID
FROM
Project
INNER JOIN Contract ON Contract.ContractID = Project.SignedContractID
INNER JOIN BookProject ON BookProject.ProjectID = Project.ProjectID
LEFT OUTER JOIN (SELECT * FROM Booklet) Booklet1 ON Booklet1.ContractID = Contract.ContractID
INNER JOIN PrintStatus AS CoverStatus ON BookProject.CoverStatusID = CoverStatus.PrintStatusID
INNER JOIN PrintStatus AS BookletStatus ON
(CASE
WHEN Booklet1.Qty > 0 THEN BookProject.BookletStatusID
ELSE -10
END) = BookletStatus.PrintStatusID
以下是结果,内部查询“(SELECT * FROM Booklet)Booklet1”:
ProjectID ContractID StatusID
501 1356 -10
502 1317 -10
503 1371 -10
...
没有内部查询的结果(仅使用“Booklet Booklet1”):
ProjectID ContractID StatusID
501 1356 -10
501 1356 0
501 1356 10
501 1356 15
501 1356 20
...
502 1317 -10
502 1317 0
502 1317 10
502 1317 15
502 1317 20
...
503 1371 -10
503 1371 0
503 1371 10
503 1371 15
503 1371 20
...
答案 0 :(得分:0)
您是否遇到处理空值处理不同设置的问题?如果在ansi null设置不同的机器上QTY可以为null,我可以看看下面的代码可能会有不同的评估。
ON
(CASE
WHEN Booklet1.Qty > 0 THEN BookProject.BookletStatusID
ELSE -10
END) = BookletStatus.PrintStatusID
答案 1 :(得分:-1)
我会尽快检查SQL Server 2008的更新是否有所作为。我在Web上看到了一些关于某些2008版SQL Server bug的评论。