【问题标题】:SQL Server: Listing Differences Between TablesSQL Server:列出表之间的差异
【发布时间】:2016-04-20 20:32:55
【问题描述】:

多年来有一些类似的主题,但我没有找到或能够做我正在寻找的东西。

我目前有两个表,它们具有我通过脚本生成的相同架构。为了名字的缘故,一个是“results_prior”,另一个是“results_current”。理想情况下,这个新查询将每月运行一次并查找是否存在任何差异。示例:

表格:results_prior

----------------------------------------
| ID | ENVIRONMENT | EDITION | CONTACT |
----------------------------------------
| 03 | Development | 2008    | Bob     |
----------------------------------------
| 05 | Production  | 2012    | Phil    |
----------------------------------------
| 09 | Development | 2008    | Erik    |
----------------------------------------
| 13 | Production  | 2012    | Ashley  |
----------------------------------------
| 22 | Production  | 2012    | Erik    |
----------------------------------------

表:results_current

----------------------------------------
| ID | ENVIRONMENT | EDITION | CONTACT |
----------------------------------------
| 03 | Development | 2008    | Bob     |
----------------------------------------
| 05 | Production  | 2012    | Phil    |
----------------------------------------
| 22 | Production  | 2012    | Erik    |
----------------------------------------

当两者比较时,结果应该是:

----------------------------------------
| ID | ENVIRONMENT | EDITION | CONTACT |
----------------------------------------
| 09 | Development | 2008    | Erik    |
----------------------------------------
| 13 | Production  | 2012    | Ashley  |
----------------------------------------

因为 09 和 13 在 results_current 中。同样,这可能是棘手的部分,如果 results_current 比 results_prior 有更多的结果,也要做同样的事情。所以,反之亦然。

抱歉,我没有示例代码可供参考。在过去的几个小时里,我一直在玩 UNION、JOIN 和 EXCEPT,我觉得我的逻辑(再次,在 SQL Server 中)没有任何意义。任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server database report relational-database


    【解决方案1】:

    这可以被视为A-B union B-A 的结果集。我假设两个表中的所有列都是相同的。因此select 中的*

    (select * from results_prior 
    except
    select * from results_current)
    union all
    (select * from results_current 
    except
    select * from results_prior)
    

    【讨论】:

      【解决方案2】:

      我会尝试类似的方法:

      SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_PRIOR
      WHERE ID NOT IN (SELECT ID FROM RESULTS_CURRENT)
      UNION
      SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_CURRENT
      WHERE ID NOT IN (SELECT ID FROM RESULTS_PRIOR)
      

      【讨论】:

      • 我会做类似的事情,但我会用“NOT EXISTS”代替“NOT IN”子句。 NOT EXISTS 的工作方式类似于 cut 运算符,因此在第一次成功时,它将停止并且不再为该上下文评估任何行。
      • 很好地回答了我的问题。然而,这是给我结果的一个,而不必跳过很多圈。我还用 * 替换了所有列并设法得到相同的结果。如果以后添加每个列/字段,这可能会有所帮助。
      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2014-06-09
      • 2019-10-25
      • 2010-09-05
      • 2021-02-13
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多