我写了两个查询来检查两个表之间的差异,如下所示。查询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
答案 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
功能。