PDA

View Full Version : [SQL] Union dentro un With


Hurry Up
17-09-2009, 16:29
Ho un problema con SQL e database su AS400

Devo fare una cosa del genere:
with XXXX as (select NUMERO from LIBRERIA.TABELLA1 UNION select NRDOCU from LIBRERIA.TABELLA2) select * from XXXX WHERE NUMERO=1000

Ho semplificato la massimo la mia query visto che il problema sta proprio qui, mi da questo errore: "Keyword UNION not expected. Valid tokens: )."

Il problema sembra essere la UNION dentro al "With XXXX as", cosa che pero' dovrebbe funzionare, ma qui con AS400 non gli piace...


Sono completamente bloccato perchè dovrei fare una union su 2 tabelle, un'altra su altre 2 tabelle (sarebbero dati attuali e storici) e fare poi una join tra di loro, non conosco altri sistemi per farlo se non questo :|

Helppppp

gugoXX
20-09-2009, 11:01
La keyword WITH e' utile solo se occorre utilizzare la parte inserita nella with per 2 o piu' volte.
E questo sembra essere il tuo caso.

Non conosco l'SQL specifico che useresti, ma proverei a proporre il seguente:


WITH xxx AS (
SELECT * FROM (
(select NUMERO from LIBRERIA.TABELLA1
UNION --- MI SA CHE VUOI METTERE "UNION ALL"
select NRDOCU from LIBRERIA.TABELLA2) as tmp1
)
)
SELECT * from xxx
join xxx
WHERE qualcosa


E comunque tieni conto che non e' detto che la parte in WITH venga risolta, memorizzata temporaneamente, e poi usata 2 (o piu') volte.
Spesso Il motore preferisce usare la definizione da 0 per entrambi i rami, agendo come di fatto la parte in WITH sia in realta' da intendersi come una vista temporanea, piuttosto che una tabella temporanea.
E, per questo motivo, la maggior parte delle volte conviene costruire e preelaborare una vera e propria tabella in cui inserire la parte in WITH, a questo punto ben condita con indici opportuni, da poi passare alla SELECT che segue.