比较两个表的差异并输出到另一个表

时间:2019-04-28 03:17:57

标签: sql sql-server

我有一个表A,其中包含有关文件列表的信息。

enter image description here

我还有另一个表B,其中包含有关同一文件列表的信息,但是LastModifyTime可能会更改。

enter image description here

现在,我想比较这两个表,找到所有差异并将其输入到表C中。表B中可能有新文件,但表A中有新文件。我可以使用

SELECT * FROM Table B

EXCEPT

SELECT * FROM Table A

它只给我列出了差异。但是我希望表C看起来像这样,包含有关LastModifyDate的区别的表A和表B的数据。

我该怎么办? left join

注意:我需要将比较结果写到表C中,而不仅仅是查询的结果。

enter image description here

4 个答案:

答案 0 :(得分:2)

您可以尝试将Outer JOIN中的Source_Last_Modify_Date与{{1}中的tableA一起使用Source_Last_Modify_Date

tbaleb

答案 1 :(得分:0)

听起来像是您需要对我使用MINUS命令。参见http://www.sqltutorial.org/sql-minus/

答案 2 :(得分:0)

由于问题陈述,以上答案仅稍有变化 “表B中可能存在新文件,但表A中存在。”

SELECT b.Source_File_Name,
         b.Source_Creation_Date,
         a.Source_Last_Modify_Date 'Source_Last_Modify_Date_From_Table_A',
         b.Source_Last_Modify_Date 'Source_Last_Modify_Date_From_Table_B'
  FROM [Table B] b 
  LEFT JOIN [Table A] a 
  ON b.Source_File_Name = a.Source_File_Name 
  AND b.Source_Creation_Date = a.Source_Creation_Date
  AND b.Source_Last_Modify_Date <> a.Source_Last_Modify_Date

可能会有所帮助。

答案 3 :(得分:0)

如果您还要考虑文件删除,则需要一种FULL JOIN或类似的机制。在FULL JOIN上进行过滤非常棘手:

SELECT COALESCE(a.Source_File_Name, b.Source_File_Name) as Source_File_Name,
       COALESCE(a.Source_Creation_Date, b.Source_Creation_Date) as Source_Creation_Date,
       a.Source_Last_Modify_Date as Source_Last_Modify_Date_From_Table_A,
       b.Source_Last_Modify_Date as Source_Last_Modify_Date_From_Table_B
FROM [Table B] a FULL JOIN
     [Table A] b
     ON b.Source_File_Name = a.Source_File_Name AND
        b.Source_Creation_Date = a.Source_Creation_Date
WHERE a.Source_File_Name IS NULL OR
      b.Source_File_Name IS NULL OR
      b.Source_Last_Modify_Date <> a.Source_Last_Modify_Date;