Ergebnisse aus 2 Tabellen 'mergen'

Wie kann man am einfachsten die Werte einer Abfrage aus einer Tabelle mit den Werten aus einer zweiten Tabelle überschreiben, falls diese vorhanden sind?

Hier mein Ansatz:

SELECT
 CASE WHEN ISNULL(Tabelle2.nRowID, 0) = 0 THEN
 Tabelle1.strString
 ELSE
 Tabelle2.strString
 END AS test
FROM Tabelle1, Tabelle2
WHERE Tabelle1.nID = 2

Das funktioniert und ist ganz nett für wenige Spalten, was für mein Szenario leider nicht zutrifft. Gibt es eine bessere Möglichkeit?

Hallo,

meinst DU etwa:

SELECT \* FROM tabelle1
UNION
SELECT \* FROM tabelle2
ORDER BY 1;

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

SELECT * FROM tabelle1
UNION
SELECT * FROM tabelle2
ORDER BY 1;

hallo peter,

sowas wäre mein wunschtraum, leider hab ich mein problem nicht detailliert genug geschildert. es handelt sich um folgendes:

ich muss änderungen an einer datenbank zwischenspeichern und erst zu einem gewissen zeitpunkt wirklich in die original-tabellen übernehmen - oder verwerfen. also eine art langfristige transaktion im hintergrund, im vordergrund (benutzeroberfläche) jedoch unsichtbar, hier sieht man sofort die änderungen.

die änderungen im programm selber zwischenzuspeichern hat auch seine tücken, da ich bei hinzufügen von elementen in „untertabellen“ eine IDENTITY/AUTO_INCREMENT erhalten will und ich so eine gesamte datenbank in meinem programm simulieren müsste.

da ich auch nicht für jede tabelle (es sind sehr viele) eine eigene [temporäre] tabelle erstellen will, habe ich eine „transaktionstabelle“ erstellt, die natürlich anders aufgebaut ist als die original-tabelle, wodurch ich auch kein „UNION“ verwenden kann. diese tabelle kann ich auch verwenden, um datensätze zu locken.

die transaktionstabelle sieht also ungefähr so aus:

tblTransactions
- nTransactionID INT
- nLoginID INT
- strOriginalTable VARCHAR
- nOriginalRowID INT
- strOriginalColumn VARCHAR
- strOriginalValue VARCHAR

vielleicht bin ich auch viel zu kompliziert und es gäbe eine viel einfachere lösung. vielleicht wären temporäre tabellen wirklich besser (auch in kombination mit einer kleineren transaktions-tabelle).

das ergebnis sollte jedenfalls so aussehen, dass ich bei einem SELECT auf einen datensatz zusätzlich die zwischengespeicherten änderungen mit einbeziehe und falls einzelne änderungen in verschiedenen columns vorhanden sind, diese statt den originaldaten ausgebe.

es geht hier übrigens wirklich nur um UPDATEs, nicht um INSERTS oder DELETEs

also beispiel:

originaltabelle
id vorname nachname strasse
10 max muster bahnhofstrasse

transaktionstabelle
id table row column value
5 originaltabelle 10 nachname mustermann
5 originaltabelle 10 strasse kirchgasse

wenn ich jetzt max muster auslesen will, sollte folgendes herauskommen:

id vorname nachname strasse
10 max mustermann kirchgasse

ich hoffe ich habe diesen nicht ganz so trivialen sachverhalt halbwegs verständlich dargelegt. hat jemand eine gute idee?

ich glaube ich werde mir das leben einfacher machen und doch temporäre tabellen verwenden (was ja mit select into bzw. create/select keine zauberei ist). vor einem update kopiere ich den kompletten betreffenden datensatz in die temp tabelle und mappe die temp tabelle in der transaktionstabelle zur originaltabelle. selects brauche ich dann nur auf die temp tabelle ausführen.

Hi!

ich muss änderungen an einer datenbank zwischenspeichern und
erst zu einem gewissen zeitpunkt wirklich in die
original-tabellen übernehmen - oder verwerfen.

Unter Oracle würden Dir hier 2 Möglichkeiten zur Verfügung stehen:

  1. Änderungen in die DB übernehmen, COMMIT erst wenn zum „gewissen Zeitpunkt“

  2. Das gute alte POST (falls es das überhaupt noch gibt)

Grüße,
Tomh

Unter Oracle würden Dir hier 2 Möglichkeiten zur Verfügung
stehen:

  1. Änderungen in die DB übernehmen, COMMIT erst wenn zum
    „gewissen Zeitpunkt“

  2. Das gute alte POST (falls es das überhaupt noch gibt)

hallo Tomh,

danke für die antwort. da haben die von oracle sich aber mal was dabei gedacht. leider muss ich für mehrere dbms schreiben und mir wird deshalb nichts anderes übrigbleiben als diese funktionalität zu simulieren (zumindest für alles ausser oracle)… aber danke für den tip, ich werde das mal versuchen.