UNPIVOT Ergebnissmenge in existierende Tabelle einfügen

mh_87

Benutzer
Beiträge
7
Hallo,

ich bin komplett neu im Forum und erhoffe mir tatkräftige Hilfe ;)
Ich muss für meine Firma Daten aus verschiedenen Spalten meiner ursprünglichen Tabelle (egl. sogar aus mehreren) in einer bereits exististierende Tabelle in Zeilen transponieren. Das gewünschte Ergebniss konnte ich mit mit der UNPIVOT Funktion schon annährend realisieren. Nun möchte ich das projezierte Ergebniss/ Result Set) in die entsprechenden Spalten meiner anderen Tabelle einfügen. Leider funktioniert meine Standard 'Insert into'+'Select (unpivot)' Kombination nicht.

Mein Code bisher:

insert into OtherTable (OtherColumn1, OtherColumn2)
SELECT *
FROM (Select SourceTable.SourceColumn1, SourceTable.SourceColumn2, SourceTable.SourceColumn3, SourceTable.SourceColumn4
from SourceTable)
UNPIVOT
(unpivoted_2 FOR unpivot_2
IN
(SourceColumn1 AS '1', SourceColumn2 AS '2', SourceColumn3 AS '5', SourceColumn4 AS 'ind'));

Die Select Anweisung mit UNPIVOT klappt soweit, aber wenn ich die INSERT INTO Anweisung davor schreibe, bekomme ich eine Reihe von Fehlermeldungen, die ich mir als Anfänger nciht erklären kann:

Fehler bei Befehlszeile : 1 Spalte : 8
Fehlerbericht -
SQL-Fehler: ORA-00903: Ungültiger Tabellenname
00903. 00000 - "invalid table name"
*Cause:
*Action:
Fehler beim Start in Zeile : 1 in Befehl -
Fehler bei Befehlszeile : 1 Spalte : 1
Fehlerbericht -
SQL-Fehler: Getrennte Verbindung
Fehler beim Start in Zeile : 1 in Befehl -
SQL-Fehler: ORA-01722: Ungültige Zahl
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
Fehler beim Start in Zeile : 1 in Befehl -

Vielleicht fällt ja jmd. direkt etwas im Code auf, das falsch ist. Ansonst kann ich
gerne auch noch die Tabellenstruktur posten.

Vielen Dank für alle Antworten.
 
Werbung:
Also die Fehlermeldung ist verwirrend, ist der Tabellenname richtig geschrieben?

Dann würde ich nicht mit Select * arbeiten, gibt der Select denn 2 Spalten zurück die auch mit Datentyp und Länge in die Zieltabelle passen?

Gibt es eventuell noch Primary Keys die in der Zieltabelle berücksichtigt werden müssen?
 
@ukulele also im originalcode ist der Tabellenname richtig, grade nochmal gecheckt.
Select * ist natürlich nicht optimal, aber ganz dumm gefragt: Hätte das nicht nur Performanzauswirkungen? (Kann ich aber natürlich ändern).
Hm also als PK gibt es in der Zieltabelle ne ID die später auf Prod. eingefügt werden soll, aber ich wenn ich z.B. einfach nur 2 Werte für die beiden Zielspalten einfüge, klappt das ohne Probleme, und ohne das ich was in die PK Spalte einfüge
 
UPDATE: Ich habe mir jetzt noch einmal meine Zieltabelle angeschaut, und meine Zielspalte ("unpivot_2") ist tatsächlich Datatype NUMBER... was die Fehlermeldung ORA-01722 erklärt, da ich CHARAKTER als Alias in meiner UNPIVOT angebe. Weiß da jmd. zufäälig ne schnelle Lösung, OHNE dass man den Datentyp in der Zieltabelle ändern muss?
 
Du kannst den Datentyp im Select anpassen, kenne jetzt die Funktionen für Oracle nicht. Dazu musst du natürlich statt * Spaltennamen verwenden.

Explizite Spaltennamen sind immer besser, nicht wegen Performance sondern wenn mal ne Spalte dazu kommt und dein bisheriger Code nach wie vor funktionieren soll. Auch die Spaltenreihenfolge kann sich ja theoretisch ändern.
 
Werbung:
Ok danke, ich schaue mir das mal an. Der SQL Developer hat mir jetzt als Optimierung eine relativ komplexe SELECT mit UNION statt der UNPIVOT angeboten, aus Performanzgründen denke ich. Hier hat der Developer natürlich auch Spaltennamen statt * eingebaut.
 
Zurück
Oben