Tabelle A um anderen Tabelle B ergänzen

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo Zusammen,

im DWH ist eine Tabelle A die einmal wöchentlich beladen wird. Ich habe historisierte Daten erstellt in einer Tabelle B. Die Tabelle B hat dabei die gleichen Spaltenüberschriften wie A. Wie kann ich nun alle Daten aus B in die Tabelle A reinschieben? Über INSERT und VALUES erschient mir dies zu aufwendig wenn die Tabellen die gleichen Überschriften haben.

Danke!
 
Werbung:
Code:
insert into Tabelle1(Spalte1, Spalte2, Spalte3) select Spalte1, Spalte2, Spalte3 from Tabelle2;

Habe es am Anfang auch mit ettlichen insert into values() probiert, bis mir gesagt wurde, dass es auch so funktioniert.
 
wenn die Datensätze verschoben werden sollen, also aus tb auch gleichzeitig gelöscht, dann geht (in PG, M$SQL weiß ich nicht) auch dies:

with move as (delete from ta returning *) insert into tb select * from move;

Das ist 1 Befehl bzw. Transaktion.
 
Es findet aber kein Abgleich statt der z.B. bestehende Datensätze ergänzt oder ersetzt. Die Daten werden 1:1 in die Zieltabelle geklatscht, egal was da noch drin liegt. Willst du erst auf Dubletten prüfen kannst du z.B. mit MERGE arbeiten.

Außerdem sollte man das * nicht bei widerkehrenden Dingen nutzen sondern das dann explizit deklarieren. Für so eine Quick & Dirty-Aktion ist das aber okay.
 
Partitioning ist ein guter Hinweis. Evtl. will er auch nur mal so eine Abfrage über beide Tabellen, dann könnte ein UNION ALL helfen.
 
Ich möchte nur einmalig historisierte Daten ergänzen. Also obwohl UNION ALL ohne Fehler geht bekomme ich bei INSERT INTO die fehlermeldung

Fehler beim Konvertieren des varchar-Datentyps in numeric.
 
Nochmal die Frage nach den zwei Tabellen. Wieso nicht alles in eine Tabelle? Dann musst du keine Daten kopieren.
 
Will er das nicht?

Du hast scheinbar zwei Spalten die gleich heißen aber nicht den selben Datentypen haben, eine NUMERIC, eine VARCHAR.
 
Nur nachgefragt, hast Du das hier ausgeführt?
insert into tabelle_a select * from tabelle_b;

Oder hast Du die Felder - und ihre Reihenfolge- angegeben?
Wenn nicht, also die Select * Variante, ist es Zufall, ob es funktioniert. Denn eine identische Reihenfolge der Felder ist nicht garantiert, wenn sie nicht angegeben wird.
 
Werbung:
Wichtig ist, wie meine Vorredner bereits gesagt haben, muss die Spaltenreihenfolge stimmen - außerdem muss der Feldtyp übereinstimmen... es fährt gegen die Wand wenn in Tabelle A Spalte 1 ein int ist und du dann dort ein Feldtyp date einfügen willst...

Am besten kommst du. wenn du es wie folgst machst:
1. schreibst du dir die Feldtypen von Tabelle A (Zieltabelle) raus
2.
INSERT INTO tabelle a (spalte 1, spalte2,...)
SELECT CAST(spalte1 AS feldtyp_den_du_von_tabelle1_aufgeschrieben_hast), CAST(spalte2 AS feldtyp_den_du_von_tabelle1_aufgeschrieben_hast), ... FROM tabelle b

Das sollte dann funktionieren und du hast alle Werte von Tabelle B an Tabelle A angefügt und kannst alles von Tabelle A nutzen.
 
Zurück
Oben