簡體   English   中英

比較兩個表中的所有列並獲取更改后的列名稱

[英]Compare all columns from two tables and get the changed columns name

我有兩個表具有相同的列名,並且每個主鍵的大多數值都相同。 對於某些主鍵,某些值是不同的。 我想捕獲其值與其他表不同的列名列表。

例如,假設我有兩個表A_old和A_new

A_old

A_old

重新

重新

我想要像下面的輸出

輸出量

我需要一種更好的方法來做到這一點。 我不需要完整的查詢。我需要的是一種更好的方法。 誰能幫我。

我認為以下查詢將提供所需的行。

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

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;

您甚至可以使用動態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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM