2016-12-29 34 views
1

我有一張表,我需要知道哪些數據已從前一天更新爲今天。假設前幾天數據在t1和當前日數據在t2中,我試圖對所有列執行「t1 FULL OUTER JOIN t2」(因爲我需要在整個表上獲取更新,而不考慮任何列),其中t2的每列都是NULL 。SQL Server:查詢獲取表增量更新

問題是,如果t1中的某一行在其任何列中都有空值,並且即使這些行在t2中保持不變,也會導致輸出,這是我不想要的。這是我的情況的一個例子。

create table t1(Host varchar(20), location varchar(20), OS varchar(20)) 
create table t2(Host varchar(20), location varchar(20), OS varchar(20)) 

    insert into t1 (Host,location,OS) 
    values ('Host1','Location1','Linux'), 
      ('Host2','Location2','Unix'), 
      ('Host3','Location3','Solaris'), 
      ('Host4','Location4','Windows'), 
      ('Host5',null,'linux') ---> Host5 remains same in both tables 

    insert into t2 (Host,location,OS) 
    values ('Host1','Location1','Linux'), 
      ('Host2','Location2','Unix'), 
      ('Host3','Location3','Windows'), 
      ('Host4','Location7','Windows'), 
      ('Host5',null,'linux') ---> Host5 remains same in both tables 

查詢:

SELECT distinct t1.Host, t1.location, t1.OS 
    FROM t1 FULL OUTER JOIN 
    t2 ON t1.Host = t2.Host 
     AND t1.location = t2.location 
     AND t1.OS = t2.OS 
    WHERE (t2.Host IS NULL) OR 
     (t2.location IS NULL) OR 
     (t2.OS IS NULL) 

輸出爲:

 
Host location OS 
--------------------------- 
NULL NULL  NULL 
Host3 Location3 Solaris 
Host4 Location4 Windows 
Host5 NULL  linux 

在預期的結果主機5需要爲同一行中的兩個表中存在被刪除。

我明白這是由於數據中WHERE條件和NULL值的FULL OUTER JOIN的本質。只是想知道是否有其他選擇只獲取更新的記錄。

+0

你想要一個左連接而不是一個完整的外連接。 – Hogan

回答

0
SELECT distinct t1.Host, t1.location, t1.OS 
FROM t1 
LEFT JOIN t2 ON 
    t1.Host = 2.Host AND 
    COALESCE(t1.location,'<<null>>') = COALESCE(t2.location,'<<null>>') AND 
    t1.OS = t2.OS 
WHERE COALESCE(t2.Host,t2.location,t2.OS) is null 

會給你點t1沒有在T2

SELECT distinct t2.Host, t2.location, t2.OS 
FROM t2 
LEFT JOIN t1 ON t1.Host = t2.Host AND t1.location = t2.location AND t1.OS = t2.OS 
WHERE COALESCE(t1.Host,t1.location,t1.OS) is null 

會給你在T1 T2不

+0

感謝您的時間。當我執行第一個查詢時,我得到了錯誤 - 在預期條件的上下文中指定的非布爾類型的表達式,靠近','。不知道我的結局是否有問題。 – Ramu

+0

@霍根它沒有。 –

+0

@TabAlleman - 他們應該修復 - 非常好...被DB2損壞 – Hogan

1

看一看EXCEPT,看看它是否適合你的需要

SELECT * 
FROM t1 
EXCEPT 
SELECT * 
FROM t2 

輸出:

Host location OS 
-------------------------------- 
Host3 Location3 Solaris 
Host4 Location4 Windows 
+0

這個工作完美,但只是想測試其他用例。謝謝你的時間 – Ramu