[英]Compare all columns from two tables and get the changed columns name
我認為以下查詢將提供所需的行。
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.