Operazioni multiple usando WITH


16

C'è un modo per eseguire più operazioni usando l' WITHistruzione?

Qualcosa di simile a

WITH T AS
(
  SELECT * FROM Tbl
)
BEGIN
  OPEN P_OUTCURSOR FOR
    SELECT * FROM T;

  SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;

Voglio selezionare alcuni dati e il loro conteggio ...

Risposte:


17

Puoi avere solo un'istruzione dopo il CTE. È possibile, tuttavia, definire i CTE successivi in ​​base a uno precedente:

WITH t1 AS (
   SELECT a, b, c
   FROM table1
)
, t2 AS (
   SELECT b
   FROM t1
   WHERE a = 5
)
SELECT *
FROM t2;

Dato che si sta tentando di contare le righe e popolare un cursore ref dallo stesso set di risultati, potrebbe essere più appropriato eseguire una delle seguenti operazioni:

  • creare una vista
  • mette in scena risultati temporanei in una tabella temporanea

Infine, se la query è abbastanza semplice, basta scriverla una volta per il conteggio e ancora per il cursore. Semplicità e leggibilità superano il principio DRY in questo caso.


10

No, un CTE o una withclausola è definita nell'ambito di una singola istruzione

A volte puoi fare più di quanto potresti aspettarti con una singola istruzione, ad esempio:

with w as (select v from t3)
insert all into t1(v) values(v)
           into t2(v) values(v)
select v from w;

Il modo "normale" di Oracle di archiviare set di risultati temporanei (se necessario) è utilizzare una tabella GTT :
GLOBAL TEMPORARY
.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.