我有两个具有相同列名的表,并且每个主键的大多数值都相同。对于某些主键,某些值是不同的。我想捕获其值与其他表不同的列名列表。
例如,假设我有两个表A_old和A_new
A_old
a_new进行
我想要输出如下
我需要一个更好的方法来做到这一点。我不需要完整的查询..我需要的是一个更好的方法。谁能帮我。
答案 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);