这两个查询之间有什么区别

时间:2016-04-06 08:13:31

标签: sql sql-server sql-server-2012

我写了两个查询来检查两个表之间的差异,如下所示。查询2向我显示了正确的结果。

在每个表中都有一个记录不在另一个表中。所以我想要一个查询来显示这两个记录,查询2会这样做。它显示了表格匹配的90行加上另外2行,一行记录在tblIH但不在tblTempN中,另一行记录在tblTempN但不在tblIH中。

而查询1只显示了表中匹配的90条记录和一条记录位于tblIH但没有显示在tblTempN中的额外行 - 但是它并没有向我显示tblTempN中不在tblIH中的记录 - 为什么?我以为使用完全外连接会显示两个表中的所有记录?我真的不明白两个查询之间的区别,因为它们对我来说似乎是一样的吗?

查询1

select coalesce(h.Sedol, nav.Sedol) Sedol,  
       coalesce(nav.Name, h.Name) Name, 
       isnull(h.Nominal, 0) - isnull(nav.Nominal, 0) NomDiff
  from tblIH h full outer join tblTempN nav 
    on h.Sedol = nav.Sedol and h.Code = nav.Code
 where h.FundCode = 'ABC' and h.DatePrice = '2015-03-20'

查询2

;with hld as
(
    select Sedol, Name, FX, Nominal from tblIH
    where DatePrice = '2015-03-20' and FundCode = 'ABC'
), nav as
(
    select Sedol, Name, Nominal from tblTempN
    where DateAcc = '2015-03-20' and FundCode = 'ABC'
)
select coalesce(hld.Sedol, nav.Sedol) Sedol,  
       coalesce(nav.Name, hld.Name) Name, 
       isnull(hld.Nominal, 0) - isnull(nav.Nominal, 0) NomDiff 
  from hld full outer join nav
    on hld.Sedol = nav.Sedol

1 个答案:

答案 0 :(得分:1)

full outer join中,如果您没有从该表获取满足的条件字段值,则将其取为空

我想你错过了写条件 nav.FundCode = 'ABC' and nav.DatePrice = '2015-03-20'

但除此之外,您还缺少一个基本的where子句将适用于full outer join的结果。

所以实际上你从全外连接中得到90 + 1 + 1,但是你的where条件正在从这个结果中过滤掉一条记录,因为对于一条所需的记录,h.FundCode和h.DatePrice值是NULL。 / p>

您可以在检查这些条件时使用NVL功能。