【问题标题】:Compare rows in SQL Server in same table (or different tables with same structure)比较同一表(或具有相同结构的不同表)中的 SQL Server 中的行
【发布时间】:2018-01-17 21:42:27
【问题描述】:

我知道这是一个非常笼统的问题,但我想知道 SQL 或其他外部工具中的选项来比较同一个 SQL 表或具有相同结构的 2 个表中的某些行。

表格包含大量列 (60)

例如,假设我们有 2 行具有相同 ID 和相似数据的不同行。

比较 2 时,是否有可能在结果中我们只是这些行之间的不同项目?

例如:

Table : Col1 Col2 Col3 Col4 Col5 ....(until column 60)  
Row 1 : AAA  BBB  CCC  DDD  EEE  
Row 2 : AAA  BBB  CCC  DDD  DDD  

结果应该返回 Col5 有差异,但其他相同。

正如我所提到的,这是一个相当开放的话题,但我想知道您的建议。

【问题讨论】:

  • 这不是标准的数据库功能。当然,您可以为任意两个给定表编写查询。
  • 您可以将创建逗号分隔字符串的代码与比较字段并适当报告的case 表达式结合起来。
  • 你知道会有很多比较吗? N(N-1)/2
  • 如果我的回答帮您解决了问题,请您点击答案旁边的复选标记,将其从灰色切换为已填充。:)

标签: sql sql-server tsql compare


【解决方案1】:

您可以为此使用外部工具。一种这样的工具是 RedGate 数据比较。它是付费的,但您可以试用 14 天。

Link to Redgate Data Compare

【讨论】:

    【解决方案2】:

    您可能想查看“EXCEPT”运算符。除了显示两个表之间的差异。结果将是第一个表中的记录。

    SELECT tbl.* FROM (VALUES
      ( 1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 2, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 3, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 4, 'AAA', 'BBB', 'CCC', 'DDD', 'DDD')
    ) tbl ([ID], [Column2], [Column3], [Column4], [Column5], [Column6]) 
    EXCEPT
    SELECT tbl.* FROM (VALUES
      ( 1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 2, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 3, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    , ( 4, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
    ) tbl ([ID], [Column2], [Column3], [Column4], [Column5], [Column6]) 
    

    db<>fiddle

    或者您可以对同一个表进行左连接。

    ;WITH
    source_data
    AS
    (
        SELECT tbl.* FROM (VALUES
          ( 1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 2, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 3, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 4, 'AAA', 'BBB', 'CCC', 'DDD', 'DDD')
        , ( 1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 2, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 3, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        , ( 4, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE')
        ) tbl ([ID], [Column2], [Column3], [Column4], [Column5], [Column6]) 
    )
    SELECT 
        tbl1.* 
    FROM
        source_data AS tbl1
        LEFT JOIN source_data AS tbl2 ON tbl1.[ID] = tbl2.[ID]
    WHERE 
        1=1
        AND 
        (
        tbl1.[Column2] != tbl2.[Column2]
        OR tbl1.[Column3] != tbl2.[Column3]
        OR tbl1.[Column4] != tbl2.[Column4]
        OR tbl1.[Column5] != tbl2.[Column5]
        OR tbl1.[Column6] != tbl2.[Column6]
        )
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多