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

Sql 比较两个表中的所有列并获取更改的列名称,sql,sql-server,Sql,Sql Server,我有两个具有相同列名的表,每个主键的大多数值都相同。对于某些主键,某些值是不同的。我想捕获其值与其他表不同的列名列表 例如,假设我有两张桌子,一张旧的,一张新的 老 新的 我想输出如下 我需要一个更好的方法来做到这一点。我不需要完整的查询。。我所需要的只是一个更好的方法。有人能帮我吗 我认为下面的查询将给出所需的行 SELECT AO.col1 ,List_of_changes = CASE WHEN AO.col2 = AN.c

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

例如,假设我有两张桌子,一张旧的,一张新的

新的

我想输出如下


我需要一个更好的方法来做到这一点。我不需要完整的查询。。我所需要的只是一个更好的方法。有人能帮我吗

我认为下面的查询将给出所需的行

    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语句,以查看匹配行中哪些列匹配,并生成所需的值。

甚至可以使用动态sql查询

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;
质疑


除了mysql和sql,还有一点混合。应该添加哪些其他标记。像PHP、JAVA,因为我相信您正在体验的响应是来自页面的动态响应您使用的是什么工具集?MySQL?SQL Server?两者同时发生?一个表在MySQL中,另一个在SQL Server中?两个表都仅在SQL Server中。我正在删除mysql标签。让我试试这个方法,如果它有效,我会将它标记为答案。谢谢如果我有20多列呢。。有没有其他办法?当语句出现时,我们是否可以使用concat函数为每种情况更新更改列表?我可以理解20多列会创建太多的case语句,无法处理。我还没有研究其他的方法。我会尽量找时间调查此事。
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);