2017-09-11 71 views
0

我有兩個表這樣比較有例外

Tableyesterday SQL Server的兩個表:

Column1 Column2 Column3  Column4 
------------------------------------------------------ 
John  5584 samsung  2017-08-31 23:43:06.867 
Bob  4512 apple  2017-08-31 23:43:06.867 
Hana  1881 nokia  2017-08-31 23:43:06.867 
Hanz  4866 alcatel  2017-08-31 23:43:06.867 
Nicol 48633 android  2017-08-31 23:43:06.867 ---gone 

Tabletoday

Column1 Column2  Column3  Column4 
------------------------------------------------------ 
John  5584  samsung  2017-09-01 23:43:06.867 ---same entry 
Bob  4542446 apple  2017-09-01 23:43:06.867 ---change in column2 
Hana  1881  halophone 2017-09-01 23:43:06.867 ---change in column3 
Hanz  4866  alcatel  2017-09-01 23:43:06.867 ---same entry 
Mark  486654  alcatel  2017-09-01 23:43:06.867 ---new entry 

,我需要選擇今天的變化和插入進入tableofchanges。只有這兩行必須選擇:

Tableofchanges

Bob  4542446 apple  2017-09-01 23:43:06.867 
Hana  1881  halophone 2017-09-01 23:43:06.867 

我創造了這個疑問,但我不能在最後的選擇包括Column4。但是,如果我做選擇,而不Column4 /插入,我不會看到Column4的結果:

insert into Tableofchanges 
    select 
     Column1, Column2, Column3 
    from 
     [dbo].[tabletoday] 
    except 
    select 
     Column1, Column2, Column3 
    from 
     [dbo].[Tableyesterday] 
    where 
     tabletoday.Column4 = Tableyesterday.Column4 

OR

INSERT INTO [dbo].[Tableofchanges] (Column1, Column2, Column3, Column4) 
    SELECT  
     Column1, Column2, Column3, Column4 
    FROM   
     [dbo].[Tableyesterday] 
    WHERE   
     (NOT EXISTS (SELECT Column1, Column2, Column3, Column4 
        FROM [dbo].[Tabletoday] 
        WHERE ([dbo].[Tableyesterday].Column1 = Column1) 
         AND ([dbo].[Tabletoday].Column1 = Column1) 
         AND ([dbo].[Tableyesterday].Column2 = Column2) 
         AND ([dbo].[Tabletoday].Column2 = Column2) 
         AND ([dbo].[Tableyesterday].Column3 = Column3) 
         AND ([dbo].[Tabletoday].Column3 = Column3))) 

非常感謝你對解決我的查詢

+1

您如何識別行 UNION 記錄? Column1是主鍵,因此您可以比較具有相同Column1的行並在Column2和Column3中查找更改? –

+0

是的,但主鍵有一天可以是新的,第二天可以走。MARK + NICOL – terka

+0

爲什麼你不能做SELECT Column1,Column2,Column3,Column4 FROM TableToday EXCEPT選擇Column1,Column2,Column3,Column4 FROM TableYesterday。這應該從今天拿起與昨天不同的所有行,或者我錯過了什麼? –

回答

0

你想記錄今天在昨天的數據中存在具有相同關鍵但屬性不同的記錄。假設你的關鍵是Column1,插入語句應該是:

insert into tableofchanges 
    select column1, column2,column3 
    from dbo.tabletoday t 
    where exists 
    (
    select * 
    from Tableyesterday y 
    where y.Column1 = t.Column1 
    and (y.Column2 <> t.Column2 or y.Column3 <> t.Column3 
); 

如果Column2Column3可以爲空,你必須要對此進行調節的WHERE條款,因爲<>不從或檢測變化空值。

+0

column2和column3可以爲NULL .. – terka

+0

然後嘗試相應地調整條件。如果您遇到問題,請回來。 –

+0

感謝您接受:-)如果您想與我的解決方案進行比較:在標準SQL中,您將用'y.column2與t.column2'不同,替換'y.column2 <> t.column2',但SQL Server不會不支持這一點。所以你應該寫一些類似'(y.column2 <> t.column2或者(y.column2爲null並且t.column2不爲null)或者(y.column2不爲null而t.column2爲null)''。這看起來很笨拙,我們經常用一個不可能的值替換null:'coalesce(y.column2,-9999)<> coalesce(t.column2,-9999)'。 –

0

在此查詢中,記錄昨天表格中當前日期在表格中更改日期的記錄。考慮到Column1是主鍵。您無法比較日期,因爲列4中的日期在今天和昨天之間發生變化。因此,拔出

記錄了有變化,這是今天剛插入都沒有了昨天

SELECT a.Column1, a.Column2, a.Column3, a.Column4 FROM Tabletoday a INNER JOIN Tableyesterday b ON a.Column1 = b.Column1 
AND (ISNULL(a.Column2,'') <> ISNULL(b.Column2,'') 
OR ISNULL(a.Column3,'') <> ISNULL(b.Column3,'')) 
UNION 
SELECT a.Column1, a.Column2, a.Column3, a.Column4 FROM @Tabletoday a 
WHERE NOT EXISTS(SELECT 1 FROM Tableyesterday b WHERE a.Column1 = b.Column1)