2014-04-03 7 views
7

Gibt es eine Möglichkeit, einen CTE für eine Liste fest codierter Werte zu erstellen? Zum Beispiel habe ich eine Liste bekannter IDs (d. H. 101,102,105,200 ...), wie würde ich in der Lage sein, ein CTE mit einer Spalte namens ID zu erstellen, aber alle ID-Werte sind in der Abfrage fest codiert? BTW, ich muss diese Abfrage in Oracle ausführen. Vielen Dank!Eine Liste definierter Werte in CTE erstellen

Antwort

10

Sie etwas tun könnte, wie

WITH cte AS (
    SELECT 101 id FROM dual UNION ALL 
    SELECT 102 FROM dual UNION ALL 
    SELECT 105 FROM dual UNION ALL 
    SELECT 200 FROM dual UNION ALL 
    ... 
) 

Je nachdem, was Sie wirklich zu erreichen versuchen, obwohl, können Sie eine Sammlung deklarieren und verwenden (mit oder ohne eine Funktion, die eine durch Kommata getrennte parst String)

CREATE TYPE num_tbl 
    AS TABLE OF NUMBER; 

WITH cte AS (
    SELECT column_value 
    FROM TABLE(num_tbl(101, 102, 105, 200)) 
) 
+0

Nur um hinzuzufügen, dass neuere Versionen zulassen, dass Spaltenaliasnamen für Unterabfrage-Factoring-Klauseln separat definiert werden, was die Abfrageklausel möglicherweise ein wenig sauberer hält: WITH cte (id) as (SELECT 101 from dual ... http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702 –

7

BEARBEITEN: zuvor empfohlene Lösung funktioniert nur für MSSQL. Daher füge ich eine Oracle-Lösung hinzu. Ich behalte die ursprüngliche Antwort unten.

Ich dachte an eine weitere Lösung (obwohl die von Justin Cave zur Verfügung gestellt scheint immer noch ein bisschen besser) - mit temporären Tabellen.

Hier ist, wie es wie

CREATE GLOBAL TEMPORARY TABLE temp_ids 
    (id INT) 
    ON COMMIT PRESERVE ROWS; 

INSERT INTO ids (id) VALUES (101); 
INSERT INTO ids (id) VALUES (102); 
INSERT INTO ids (id) VALUES (103); 

sollte eine gültige Lösung für Oracle-Datenbank folgendermaßen aussehen kann.

Ursprüngliche Antwort unten


ich auf ähnliche Frage gekommen sind und hier ist meine Lösung (das funktioniert nicht auf Oracle-DB, wie in den Kommentaren erwähnt, nur MSSQL obwohl)

WITH cte AS (
    SELECT * FROM (
     VALUES 
      (1, 2, 3, ...), 
      (2, 3, 4, ...) 
     ) AS a (col1, col2, col3, ...) 
    ) 
INSERT INTO ... 

Hoffnung das hilft :)

+1

Diese Syntax ist in Oracle nicht gültig. –

+0

Deshalb bedauere ich Verwirrung und danke Ihnen für die Informationen. Hoffentlich hilft dies anderen, die in MSSQL nach dem gleichen suchen. – Zax

+0

Ok, ich habe die vorherige Antwort bearbeitet und hinzugefügt, was ich denke, sollte auch für Oracle eine gültige Lösung sein. – Zax