Sql 左外联接中的内部查询

Sql 左外联接中的内部查询,sql,sql-server,join,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 然后得到了我想要的。我想知道为什么这两行给出不同的结果。谁能给我解释一下吗 另外,我使用SQL Server 2008 编辑2:我发布了一个显示问题的帖子 编辑1:以下是显示问题的完整最小查

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

LEFT OUTER JOIN T1 ON T1.ID = T2.ID
由于查询的行太多,导致结果不正确,因此我正在处理它,当我尝试此操作时:

LEFT OUTER JOIN (SELECT * FROM T1) T1 ON T1.ID = T2.ID
然后得到了我想要的。我想知道为什么这两行给出不同的结果。谁能给我解释一下吗

另外,我使用SQL Server 2008

编辑2:我发布了一个显示问题的帖子

编辑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
以下是使用内部查询从手册1中选择*的结果:

ProjectID ContractID StatusID
  501       1356       -10
  502       1317       -10
  503       1371       -10
  ...
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
  ...
而不使用内部查询的结果仅使用小册子1:

ProjectID ContractID StatusID
  501       1356       -10
  502       1317       -10
  503       1371       -10
  ...
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
  ...

我会尽快检查SQL Server 2008的更新是否会产生影响。我在网上看到了一些关于SQL Server某些2008版本中的a的评论。

您是否会遇到处理空值的不同设置的问题?如果ANSINULL设置不同的机器上的QTY可以为null,我可以看到下面的代码的计算结果可能不同

ON 
    (CASE
        WHEN Booklet1.Qty > 0 THEN BookProject.BookletStatusID 
        ELSE -10
    END) = BookletStatus.PrintStatusID

除非你能用一个小而完整的查询重现这个问题,并解释你得到的是什么样的重复项,否则可能不会得到太多帮助。也许可以尝试使用上一个表SELECT*FROM T2 LEFT EXTER JOIN T1进行较小的查询。。。使用这两个变体,并查看它是否演示了问题,那么您将有一个较小的查询,并可以发布完整的查询。如果您不能像那样重现问题,那么这表明查询的其余部分在某种程度上对您看到的行为有所贡献,而不仅仅是您发布的代码片段。出于好奇,如果您将子查询的别名从T1更改为T1,会有什么不同吗?左外连接选择*从T1上导出T1上导出T1上导出T1导出的。TheID=T2.TheID。不应该这样做,但我发现它影响了实际的执行计划。@KarlKieninger我试过了,但没有什么区别,我得到了一个别名或另一个别名的不同行。有些事情让我抓狂:我在我的开发机器上,用SQLServer2008得到这些结果;但是,当我在运行SQLServer2008R2的生产服务器上备份/恢复完整数据库时,总是会得到不同的行。换句话说,没有内部查询的原始查询在两台机器上的行为不一样。您确定结果集不同吗?或者他们只是看起来不同?结果集应该完全相同,但行的顺序可能不同。奇怪的是:结果应该相同,但23行与343行之间差异很大。这在SQL Server中从来都不是错误。。。尤其是在JOIN中没有bug。到目前为止,SQL Server执行了多少万亿次连接?论坛上的那个家伙把他的错误归咎于SQL Server。;您的查询可能是不确定的。因此,查询中的随机更改会导致结果的更改。那么,为什么两台服务器上的结果不同呢?我提醒您,它们是使用备份/恢复创建的同一数据库的两个副本。所以,相同的表结构、相同的查询、相同的数据;但是结果不同。不同的查询计划,或者查询计划是不确定的,首先是并行性、无序预取、不区分大小写的分组。。。。查询结果很容易不确定。我编辑了问题的描述。也许你可以帮我检测查询的非确定性部分。对于未定义的行为,查询看起来非常安全。不过,我很确定它就在那里。看看@HLGEM说了什么,值得一试。是否依赖于视图?在查询的开始处有一个语句集ANSI_NULLS on。此外,在实际生产查询中,比本文中显示的简化查询长得多,该行显示:当小册子1.Qty不为空且小册子1.Qty>0时,则。。。我删除了IS NOT NULL部分,因为它对我在这里提交的问题没有任何明显的影响。