2016-08-19 6 views
0

Ich habe zwei Tabellen mit gleichen Spaltennamen und die meisten Werte sind die gleichen für die einzelnen Primärschlüssel. Für einige Primärschlüssel sind einige Werte unterschiedlich. Ich möchte die Liste der Spaltennamen erfassen, deren Werte sich von der anderen Tabelle unterscheiden.Vergleichen Sie alle Spalten aus zwei Tabellen und erhalten Sie den geänderten Spaltennamen

Zum Beispiel können sagen, ich habe zwei Tabellen A_old und A_New

A_old

A_old

A_New

A_new

Ich möchte eine Ausgabe wie unten

Output

Ich brauche einen besseren Ansatz, dies zu tun. Ich brauche die vollständige Abfrage nicht. Alles, was ich brauche, ist ein besserer Ansatz. Kann mir jemand helfen.

+0

Neben 'mysql' und' sql' ein bisschen Mischung gibt. Welches andere Tag sollte hinzugefügt werden? wie PHP, JAVA, weil ich glaube, dass die Antwort, die Sie ausgeben, eine dynamische Antwort von einer Seite ist –

+0

Welchen Werkzeugsatz benutzen Sie? MySQL? SQL Server? Beides gleichzeitig? Ist eine Tabelle in MySQL und die andere in SQL Server? –

+0

Beide Tabellen sind nur in SQL Server. Ich entferne den mysql Tag. –

Antwort

2

Ich denke, die folgende Abfrage würde die gewünschten Zeilen geben.

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 

Hier denke ich * mit CASE-Anweisungen ersetzen sein kann, um zu sehen, welche Spalten in der entsprechenden Zeile entsprechen und erzeugen Sie die gewünschten Werte.

+0

Lassen Sie mich diesen Ansatz versuchen und wenn es funktioniert, werde ich es als Antwort markieren. Vielen Dank..! –

+0

Was ist, wenn ich mehr als 20 Spalten habe? Gibt es einen alternativen Ansatz? können wir nicht die Liste der Änderungen mit concat-Funktion für jeden Fall aktualisieren, wenn Anweisungen ..? –

+0

Ich kann verstehen, 20 + Spalten würde zu viele Case-Anweisungen zu behandeln. Ich habe noch keinen alternativen Ansatz untersucht. Ich werde versuchen, Zeit dafür zu finden. –

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; 
1

Sie können sogar dynamische SQL-Abfrage verwenden.

Abfrage

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); 
Verwandte Themen