2014-04-03 13 views
7

Esiste un modo per creare un CTE per un elenco di valori codificati? Ad esempio, ho un elenco di ID noti (ad esempio 101.102.105.200 ...), come potrei creare un CTE con una colonna chiamata ID ma tutti i valori ID sono codificati nella query? A proposito, ho bisogno di eseguire questa query in Oracle. Grazie!Crea un elenco di valori definiti in CTE

risposta

10

Si potrebbe fare qualcosa di simile

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 
    ... 
) 

A seconda di ciò che si sta realmente cercando di realizzare, però, si può decidere di dichiarare una raccolta e l'uso che (con o senza una funzione che analizza una virgola-separati stringa)

CREATE TYPE num_tbl 
    AS TABLE OF NUMBER; 

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

Solo per aggiungere che le versioni recenti consentono di definire separatamente gli alias di colonna per le clausole di factoring dei subquery, potenzialmente mantenendo la clausola di query un po 'più ordinata: WITH cte (id) as (SELEZIONA 101 da doppio ... http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702 –

7

MODIFICA: la soluzione precedentemente consigliata funziona solo per MSSQL. Pertanto sto aggiungendo una soluzione Oracle. Sto mantenendo la risposta originale qui sotto.

Ho pensato ad un'altra soluzione (anche se quella fornita da Justin Cave sembra ancora un po 'meglio) - utilizzando tabelle temporanee.

Ecco come potrebbe sembrare

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); 

Questa dovrebbe essere una valida soluzione per il database Oracle.

risposta originale al di sotto


ho incontrato problema simile, e qui è la mia soluzione (questo non funziona su Oracle DB come accennato nei commenti, solo MSSQL però)

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

Speranza questo aiuta :)

+1

Questa sintassi non è valida in Oracle. –

+0

Pertanto mi dispiace per la confusione e grazie per l'informazione. Speriamo che questo possa aiutare qualcun altro a cercare lo stesso in MSSQL. – Zax

+0

Ok, ho modificato la risposta precedente e ho aggiunto quello che penso dovrebbe essere una soluzione valida anche per Oracle. – Zax