LEFT OUTER JOIN中的内部查询

时间:2014-04-01 00:28:02

标签: sql sql-server join

我有一个很长的查询,在某些时候,我有这个:

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
  ...

2 个答案:

答案 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的评论。