MS SQL Datensatz vergleichen
Ist es möglich zwei Datensätze in SQL zu vergleichen und nur die unterschiede auszugeben?
Hallo,
ich habe ein MS SQL-Problem von dem ich nicht genau weis, wie ich es lösen kann. Ich habe zwei Tabellen mit identischer Struktur. In den Tabellen sind jeweils Computerkonfigurationen gespeichert. In der ersten Tabelle jeweils die aktuelle und in der zweiten eine Konfiguration von vor ein Paar Tagen.
Tabelle 1
Tabelle 2
Nun würde ich die beiden Datensätze in der Tabelle miteinander vergleichen und nur die geänderten Werte angezeigt bekommen. Die Datensätze sind jeweils im Feld UUID identisch und somit identifizierbar. Ist soetwas mit einer oder mehreren SQL-Abfragen möglich? Ald Datenbank verwende ich derteit einen Microsoft SQL 2008 Server Express.
Die Ausgabe könnte dann z.B. wie folgt aussehen:
Über eine Lösung wüde ich mich feuen.
Viele Grüße
Taucher4000
Hallo,
ich habe ein MS SQL-Problem von dem ich nicht genau weis, wie ich es lösen kann. Ich habe zwei Tabellen mit identischer Struktur. In den Tabellen sind jeweils Computerkonfigurationen gespeichert. In der ersten Tabelle jeweils die aktuelle und in der zweiten eine Konfiguration von vor ein Paar Tagen.
Tabelle 1
UUID | name | prozessor | speicher | ...... |
---|---|---|---|---|
123456 | pcname-1 | Intel Core2Quad 2,4 GHz | 2048MB | ...... |
Tabelle 2
UUID | name | prozessor | speicher | ...... |
---|---|---|---|---|
123456 | pcname-2 | Intel Core2Duo2,2 GHz | 2048MB | ...... |
Nun würde ich die beiden Datensätze in der Tabelle miteinander vergleichen und nur die geänderten Werte angezeigt bekommen. Die Datensätze sind jeweils im Feld UUID identisch und somit identifizierbar. Ist soetwas mit einer oder mehreren SQL-Abfragen möglich? Ald Datenbank verwende ich derteit einen Microsoft SQL 2008 Server Express.
Die Ausgabe könnte dann z.B. wie folgt aussehen:
UUID | alter-wert | neuer-wert |
---|---|---|
123456 | Intel Core2Duo 2,2 GHz | Intel Core2Quad 2,4 GHz |
123456 | pcname-2 | pcname-1 |
Über eine Lösung wüde ich mich feuen.
Viele Grüße
Taucher4000
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 145187
Url: https://administrator.de/forum/ms-sql-datensatz-vergleichen-145187.html
Ausgedruckt am: 26.12.2024 um 02:12 Uhr
3 Kommentare
Neuester Kommentar
Moin Taucher4000,
mach doch einfach ein UNION ALL über beide Tabellen und ein GROUP BY mit HAVING über alle (relevanten) Felder.
Alle Datensätze, von denen es nicht 2 deckungsgleiche gibt lässt du anzeigen.
Sinngemäß & ungetestet:
Wenn du allerdings die oben gepostete Darstellung (also mit 1 Zeile pro abweichender Spalte) haben willst,
dann wird es ziemlich aufwändig -> würde ich nur im Notfall weiterdiskutieren.
Grüße
Biber
mach doch einfach ein UNION ALL über beide Tabellen und ein GROUP BY mit HAVING über alle (relevanten) Felder.
Alle Datensätze, von denen es nicht 2 deckungsgleiche gibt lässt du anzeigen.
Sinngemäß & ungetestet:
SELECT Min(quelltab), UUID, name , prozessor , speicher, whatelse
FROM (
SELECT "Tabelle1" as QuellTab, UUID, name , prozessor, speicher, Feldxy as Whatelse
FROM Tabelle1
UNION ALL
SELECT "Tabelle2" , UUID, name , prozessor, speicher, Feldxy
FROM Tabelle2
) x
GROUP BY x.UUID, x.name , x.prozessor, x.speicher, x.whatelse
HAVING x.QuellTab < 2
Wenn du allerdings die oben gepostete Darstellung (also mit 1 Zeile pro abweichender Spalte) haben willst,
dann wird es ziemlich aufwändig -> würde ich nur im Notfall weiterdiskutieren.
Grüße
Biber
Hallo,
ich würde erst selektieren, und dann ein UNION machen:
SELECT tabelle1.uuid, tabelle1.prozessor as alt, tabelle2.prozessor as neu from tabelle1 inner join tabelle2 on tabelle1.uuid = tabelle2.uuid WHERE tabelle1.prozessor <> tabelle2.prozessor
UNION
SELECT tabelle1.uuid, tabelle1.name as alt, tabelle2.name as neu from tabelle1 inner join tabelle2 on tabelle1.uuid = tabelle2.uuid WHERE tabelle1.name <> tabelle2.name
UNION
...gleiches nochmal für speicher etc
sicher geht das mit etwas T-SQL-Programmierung noch eleganter, so dass man nicht für jede Spalte eine eigene SELECT-Zeile braucht (die Spalten lassen sich ja aus dem Schema einlesen, und dann automatisiert über alle iterieren). Aber da muss man dann schon tiefer einsteigen...
Gruß
Filipp
ich würde erst selektieren, und dann ein UNION machen:
SELECT tabelle1.uuid, tabelle1.prozessor as alt, tabelle2.prozessor as neu from tabelle1 inner join tabelle2 on tabelle1.uuid = tabelle2.uuid WHERE tabelle1.prozessor <> tabelle2.prozessor
UNION
SELECT tabelle1.uuid, tabelle1.name as alt, tabelle2.name as neu from tabelle1 inner join tabelle2 on tabelle1.uuid = tabelle2.uuid WHERE tabelle1.name <> tabelle2.name
UNION
...gleiches nochmal für speicher etc
sicher geht das mit etwas T-SQL-Programmierung noch eleganter, so dass man nicht für jede Spalte eine eigene SELECT-Zeile braucht (die Spalten lassen sich ja aus dem Schema einlesen, und dann automatisiert über alle iterieren). Aber da muss man dann schon tiefer einsteigen...
Gruß
Filipp