Einzelne SQL-SELECT-Rückkehr mehrere Zeilen aus einer Tabelle, Zeile
Haben wir eine Tabelle, die ist von der form:
ID,Value1,Value2,Value3
1,2,3,4
Müssen wir verwandeln diese in.
ID,Name,Value
1,'Value1',2
1,'Value2',3
1,'Value3',4
Ist es ein cleverer Weg, dies zu tun, in einer SELECT-Anweisung (ich.e ohne Gewerkschaften)? Die Namen der Spalten Wert1,Wert2 und Wert3 sind vorgegeben und konstant.
Ist die Datenbank oracle 9i.
Was DB-server verwenden Sie?
Sind 1,2,3,4 Spalten oder Daten Werte?
Dies ist ziemlich ähnlich zu dieser Frage
Die cleverste Art und Weise, dass ich denken kann, ist die Neugestaltung Ihrer Datenbank, so dass es normalisiert 🙂
Tom, es ist nicht in meiner Datenbank 😉
Sind 1,2,3,4 Spalten oder Daten Werte?
Dies ist ziemlich ähnlich zu dieser Frage
Die cleverste Art und Weise, dass ich denken kann, ist die Neugestaltung Ihrer Datenbank, so dass es normalisiert 🙂
Tom, es ist nicht in meiner Datenbank 😉
InformationsquelleAutor James L | 2009-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Werke auf Oracle 10g:
Ich denke, Oracle 9i, hatte rekursive Abfragen? Ich bin jedenfalls ziemlich sicher, es hat den FALL so zu unterstützen, auch wenn Sie es nicht haben, rekursive Abfragen, können Sie einfach tun "(select 1 from dual union all select 2 from dual union all select 3 von dual) ofs" statt. Missbrauchen rekursive Abfragen ist ein bisschen mehr allgemein für Oracle. (Mit Gewerkschaften zu generieren Zeilen ist portabel auf andere DBs, obwohl)
InformationsquelleAutor araqnid
Geben
union
einen Schuss.mit
union all
bedeutet, dass der server nicht an eindistinct
(implizit ist inunion
Operationen). Es sollte nicht keinen Unterschied machen, mit den Daten (da Sie Ihre ID ' s HOFFENTLICH anders sein), aber könnte es beschleunigen ein wenig.Mit "union all" auf jeden Fall gewonnen T machen einen Unterschied bei der Ausgabe, da 'Value1', 'Value2" und "Value3" sind alle unterschiedlichen! Aber es wird vermieden, die DB unnötig versuchen zu uniquify die Zeilen.
Gute Antwort, aber die Frage nach einer Möglichkeit gefragt ohne Gewerkschaften!
Die Frage wurde bearbeitet, um hinzufügen, dass der VORBEHALT nach meiner Antwort gepostet wurde.
Problem ist hier mit drei scans über die Tabelle, in der Erwägung, dass die beste option, um scan nur einmal.
InformationsquelleAutor Adam Robinson
Können Sie es so machen, aber es ist nicht schön:
InformationsquelleAutor Dave Webb
Unioning drei select-Anweisungen sollten den trick tun:
InformationsquelleAutor dpmattingly
Wenn Sie mithilfe von SQL Server 2005+ dann können Sie UNPIVOT
InformationsquelleAutor Robin Day
Einer UNION ALL, wie andere vorgeschlagen haben, ist wahrscheinlich Ihre beste Wette in SQL. Vielleicht wollen Sie auch zu erwägen, die Behandlung dieses in der front-end-je nachdem, was Ihre spezifischen Anforderungen sind.
InformationsquelleAutor Tom H
CTE-syntax kann unterschiedlich sein für die Oracle - (ich habe es in Teradata), aber ich habe nur verwendet, CTE, um eine test-Daten, die 1 2 3 und 4. Sie können temp-Tabelle statt. Die eigentliche select-Anweisung wird die plain-vanilla-SQL-und es wird auf einer relationalen Datenbank.
InformationsquelleAutor Jake Orshansky
Für Sql Server, betrachten UNPIVOT als alternative zur UNION:
Wird das Ergebnis der Spalte name als auch. Ich bin mir nicht sicher, was das X ist, aber Sie können es nicht lassen.
InformationsquelleAutor Andomar
Versuchen Sie dies:
CTE erstellt eine temporäre Tabelle mit 4 Werten. Sie können führen Sie diese wie in jeder Datenbank.
Hier ist das ResultSet:
Genießen!
Einige Nachträge.
^^^ CTE-syntax kann in Oracle. Ich konnte nur laufen Sie in Teradata. Sie können ersetzen es mit temp-Tabelle, oder korrigieren Sie die syntax, um es Oracle kompatibel. Die select-Anweisung wird die plain-vanilla-SQL für beliebige Datenbank.
^^^ Eine weitere Sache zu beachten. Wenn ID-Feld numerisch ist, müssen Sie möglicherweise zu casten in CHAR um zu verketten, es mit "Wert".
Ich habe gerade einige Kommentare zu meinem Beitrag.
InformationsquelleAutor Jake Orshansky