【问题标题】:SQL Table data compareSQL 表数据比较
【发布时间】:2014-09-25 09:51:32
【问题描述】:

我需要比较两个表的行,并且只显示具有不同数据的列,即表中的数据不匹配。假设表 1 和表 2 有 50 列,并且只有错误记录为 5,那么库需要进入 Select 语句.

比较部分通过联合查询完成,我的障碍是如何想出错误的行列名称。

【问题讨论】:

  • 分享您的表结构和数据
  • 到目前为止你已经得到了什么
  • 嗨,吉姆,到目前为止,我能够从两个表中获取不匹配的数据,但我需要 select 语句中唯一错配的列
  • AK、My table1 和 Table2 具有除主键外的所有 varchar(Max) 数据类型的列。喜欢:
  • 选择语句总是产生一组给定的列。因此,不能通过查询来找出哪些列有差异并只显示那些。也许您应该简单地使用带有 GUI 的编程语言,您可以在其中选择两个表,然后逐条比较记录并用差异填充 GUI 网格。如果您想坚持使用 SQL:您可以选择包含差异的字符串,例如 'id 30: col2 = "ABC" vs ""DEF" , col26 = 13 vs 12'。但是您的查询必须逐个字段进行比较为了构建那个字符串。

标签: sql sql-server join union


【解决方案1】:

做到这一点的一种方法是将所有此类列名的列表连接在一个字符串中,如下所示:

select
T1.id, case when t1.col1<> t2.col1 then 'Col1;' else '' end +
    case when t1.col2<> t2.col2 then 'Col2;' else '' end 
    -- similar case statementes for all th columns you want to be included 
    -- in the list
    as Mismatchedcolumns
from Table1 T1
Join Table2 T2 on T1.id = T2.id

Check Demo here..

【讨论】:

    【解决方案2】:

    如果您正在查看所有不匹配列的列表,请查看以下示例

    CREATE TABLE TableA
        ([Product] varchar(1), [Qty] int, [Price] int, [Comments] varchar(3))
    ;
    
    INSERT INTO TableA
        ([Product], [Qty], [Price], [Comments])
    VALUES
        ('A', 20, 500, 'xyz'),
        ('B', 50, 200, 'xyz'),
        ('C', 90, 100, 'abc'),
        ('D', 50, 500, 'xyz')
    ;
    
    CREATE TABLE TableB
        ([Product] varchar(1), [Qty] int, [Price] int, [Comments] varchar(3))
    ;
    
    INSERT INTO TableB
        ([Product], [Qty], [Price], [Comments])
    VALUES
    
        ('B', 70, 200, 'cv'),
        ('C', 90, 200, 'wsd'),
        ('D', 40, 400, 'xyz'),
        ('E', 50, 500, 'xyz')
    ;
    
    
    
    SELECT  b.Product,
            b.Qty,
            b.Price,
            Result = CASE WHEN a.product IS NULL THEN 'New'
                        ELSE 'Updated: ' + 
                            STUFF(  CASE WHEN a.Qty != b.Qty THEN ',Qty' ELSE '' END + 
                                    CASE WHEN a.Price != b.Price THEN ',Price' ELSE '' END,
                                1, 1, '')
                    END
    FROM    TableB b    
            LEFT JOIN TableA a
                ON a.Product = b.Product
    WHERE   a.Product IS NULL
    OR      a.Qty != b.Qty
    OR      a.Price != b.Price
    
    union
    
    SELECT 
    a.Product,a.Qty,a.Price, 'NewA' as Result
    FROM 
    TABLEA a left join
    TABLEB b on a.Product = b.Product
    WHERE b.Product is null
    

    修改版解决方案SQL Server 2008 compare two tables in same database and get column is changed

    http://sqlfiddle.com/#!3/d1b3f/3

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2018-10-20
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多