比较两个表中的所有列并获取更改的列名称

时间:2016-08-19 05:52:59

标签: sql sql-server

我有两个具有相同列名的表,并且每个主键的大多数值都相同。对于某些主键,某些值是不同的。我想捕获其值与其他表不同的列名列表。

例如,假设我有两个表A_old和A_new

A_old

A_old

a_new进行

A_new

我想要输出如下

Output

我需要一个更好的方法来做到这一点。我不需要完整的查询..我需要的是一个更好的方法。谁能帮我。

3 个答案:

答案 0 :(得分:3)

我认为以下查询会给出所需的行。

    SELECT 
    AO.col1
    ,List_of_changes = 
         CASE 
         WHEN AO.col2 = AN.col2 AND AO.col3 = AN.col3 AND AO.col4 = AN.col4 THEN 'NO CHANGES'
         WHEN AO.col2 <> AN.col2 AND AO.col3 <> AN.col3 AND AO.col4 <> AN.col4 THEN 'col2, col3, col4'
         WHEN AO.col2 = AN.col2 AND AO.col3 = AN.col3 AND AO.col4 <> AN.col4 THEN 'col4' 
         WHEN AO.col2 = AN.col2 AND AO.col3 <> AN.col3 AND AO.col4 <> AN.col4 THEN 'col3, col4' 
         WHEN AO.col2 = AN.col2 AND AO.col3 <> AN.col3 AND AO.col4 = AN.col4 THEN 'col3'  
         WHEN AO.col2 <> AN.col2 AND AO.col3 = AN.col3 AND AO.col4 = AN.col4 THEN 'col2' 
         WHEN AO.col2 <> AN.col2 AND AO.col3 <> AN.col3 AND AO.col4 = AN.col4 THEN 'col2,col3' 
         WHEN AO.col2 <> AN.col2 AND AO.col3 = AN.col3 AND AO.col4 <> AN.col4 THEN 'col2,col4' 
--and so on
         END 
    FROM
    A_old AO
    INNER JOIN A_new AN ON
    AN.col1 = AO.col1

在这里,我认为*可以替换为CASE语句,以查看匹配行中哪些列匹配并生成所需的值。

答案 1 :(得分:3)

SELECT col1, col2, col3, col4
FROM
 (
   SELECT *
   FROM a_old
   UNION ALL
   SELECT *
   FROM a_new
)  t
GROUP BY col1, col2, col3, col4
HAVING COUNT(*) = 1
ORDER BY col1;

答案 2 :(得分:2)

您甚至可以使用动态SQL查询。

<强>查询

DECLARE @sql AS varchar(max);

SELECT @sql = 'select t1.col1, ' + STUFF((SELECT
    '+ case when t1.' + column_name + ' = t2.' + column_name + ' then '''' 
    else ''' + column_name + ''' end '
FROM information_schema.columns
WHERE table_name = 'A_new'
AND column_name <> 'col1'
ORDER BY column_name
FOR xml PATH (''))
, 1, 2, '') + ' as list_of_changes from A_old t1 join A_new t2 on t1.col1 = t2.col1';

SELECT @sql = 'select t.col1, case when len(t.list_of_changes) = 0 then ''No changes'' 
              else t.list_of_changes end as list_of_changes 
              from(' + @sql + ')t;';

EXEC (@sql);
相关问题