2016-04-06 181 views
-2

我已經寫了兩個查詢來檢查兩個表之間的差異,如下所示。查詢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

在第一個查詢中,在'tbletemp'表中沒有兩個條件'DateAcc ='2015-03-20'和FundCode ='ABC'',但在第二個查詢中,您在對應的'with'條款 –

+0

'其中h.FundCode ='ABC'和h.DatePrice ='2015-03-20''是否可能? –

+0

q1實際上是一個內部連接。 q2是全外連接。 – jarlh

回答

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。

您可以在檢查這些情況時使用NVL函數。