比较SQL Server中的两个表和异常

时间:2017-09-11 08:33:35

标签: sql sql-server sql-server-2008

我有两张这样的表

Tableyesterday

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)))

非常感谢您修复我的查询

2 个答案:

答案 0 :(得分: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可以为null,则必须为此调整WHERE子句,因为<>未检测到null的更改

答案 1 :(得分: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)