Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL表数据比较_Sql_Sql Server_Join_Union - Fatal编程技术网

SQL表数据比较

SQL表数据比较,sql,sql-server,join,union,Sql,Sql Server,Join,Union,我需要比较两个表的行,并且只显示具有不同数据的coulmn,即来自两个表的数据不匹配。假设表1和表2有50列,其中只有mistach记录是5,那么coulms需要进入Select语句 比较部分是使用Union查询完成的,我的障碍是如何找出不匹配的行-列名称。一种方法是将所有此类列名的列表串联在一个字符串中,如下所示: select T1.id, case when t1.col1<> t2.col1 then 'Col1;' else '' end + case when t

我需要比较两个表的行,并且只显示具有不同数据的coulmn,即来自两个表的数据不匹配。假设表1和表2有50列,其中只有mistach记录是5,那么coulms需要进入Select语句


比较部分是使用Union查询完成的,我的障碍是如何找出不匹配的行-列名称。

一种方法是将所有此类列名的列表串联在一个字符串中,如下所示:

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

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

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
解决方案的修改版本位于


共享您的表结构和数据以及迄今为止您所拥有的内容Hi Jim,到目前为止,我能够从两个表中获取不匹配的数据,但我需要select语句TAK中唯一错误缓存的列,我的表1和表2具有除主键之外的所有varcharMax数据类型列。比如:select语句总是产生一组给定的列。因此,查询的结果不能是找出哪些列有差异并仅显示这些差异。也许您应该简单地使用带有GUI的编程语言,在GUI中选择两个表,然后逐个记录比较,并用差异填充GUI网格。如果您想坚持使用SQL:您可以选择一个包含差异的字符串,例如“ID30:col2=ABC vs DEF,col26=13 vs 12”。但是,您的查询必须逐个字段进行比较才能生成该字符串。