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
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))
)
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 :)
Questa sintassi non è valida in Oracle. –
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
Ok, ho modificato la risposta precedente e ho aggiunto quello che penso dovrebbe essere una soluzione valida anche per Oracle. – Zax
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 –