Piccola lezione di SELECT ANNIDATE

mercoledì 28 maggio 2008 - 10.33

controvento Profilo | Newbie

Salve a tutti, mi dovete scusare, ma proprio non riesco a capire il meccanismo delle SELECT annidate, ecco su cosa mi sono bloccato:


(SELECT codice_ean,nome_promozione FROM promozioni_m_x_n) UNION (SELECT codice_ean,nome_promozione FROM promozioni_per_data)

Fin qui, tutto ok, ho la mia bella tabella con 2 colonne, ma proviamo ad usare la stessa query, con 2 parentesi in più:


( (SELECT codice_ean,nome_promozione FROM promozioni_m_x_n) UNION (SELECT codice_ean,nome_promozione FROM promozioni_per_data) )

#1064 - Errore di sintassi nella query SQL vicino a ' (SELECT codice_ean,nome_promozione FROM promozioni_m_x_n) UNION (SELECT codice_ean' linea 1

Errore di sintassi? Per 2 parentesi esterne in più?Bah...non lo capisco...è il primo linguaggio che odia le parentesi in più.

Allora proviamo così:

SELECT codice_ean FROM ( SELECT codice_ean,nome_promozione FROM promozioni_m_x_n )UNION( SELECT codice_ean,nome_promozione FROM promozioni_per_data )

#1248 - Every derived table must have its own alias

Ah, ecco...vuoi gli alias per le tabella derivate...va bene:

SELECT codice_ean FROM ( SELECT codice_ean,nome_promozione FROM promozioni_m_x_n AS T1 )UNION( SELECT codice_ean,nome_promozione FROM promozioni_per_data AS T2 )

#1248 - Every derived table must have its own alias

Di nuovo? Toh, stupido io, Mysql l'alias lo vuole per la tabella derivata dalla UNION, non per quella derivata dalla SELECT annidate:

SELECT codice_ean FROM ( ( SELECT codice_ean,nome_promozione FROM promozioni_m_x_n AS T1 )UNION ( SELECT codice_ean,nome_promozione FROM promozioni_per_data AS T2 ) AS T3 )

#1248 - Every derived table must have its own alias


Ancora?...bah, e cosa resta?Abbondiamo!

SELECT codice_ean FROM ( ( (SELECT codice_ean,nome_promozione FROM promozioni_m_x_n AS T1) UNION (SELECT codice_ean,nome_promozione FROM promozioni_per_data AS T2) )AS T3 ) AS T4

#1248 - Every derived table must have its own alias

Olèèè...

Vabbè, per esperienza so che il linguaggio di programmazione alla fine ha sempre ragione, facciamo un ultimo tentativo, la clausola AS va usata nelle SELECT, qui forse un AS T3 è fuori posto...


SELECT codice_ean FROM ( SELECT * FROM ( ( SELECT codice_ean, nome_promozione FROM promozioni_m_x_n AS T1 )UNION ( SELECT codice_ean, nome_promozione FROM promozioni_per_data AS T2 ) ) AS T3 )AS T4

#1248 - Every derived table must have its own alias


...dite la verità, mysql mi sta un pò a prendere per il fondoschiena?

Sarò grato a chiunque mi dia una mano in queste sante e benedette query annidate...

alx_81 Profilo | Guru

>Salve a tutti,
Ciao!

>mi dovete scusare, ma proprio non riesco a capire
>il meccanismo delle SELECT annidate, ecco su cosa mi sono bloccato:
>
>Allora proviamo così:
>
>
>SELECT codice_ean FROM
>(
>SELECT codice_ean,nome_promozione FROM promozioni_m_x_n
>)UNION(
>SELECT codice_ean,nome_promozione FROM promozioni_per_data
>)
>
>
>#1248 - Every derived table must have its own alias
>
>Ah, ecco...vuoi gli alias per le tabella derivate...va bene:
>
>
>SELECT codice_ean FROM
>(
>SELECT codice_ean,nome_promozione FROM promozioni_m_x_n AS T1
>)UNION(
>SELECT codice_ean,nome_promozione FROM promozioni_per_data AS
>T2
>)
No, questa non è la soluzione all'errore, ma questa:

SELECT T.codice_ean FROM ( SELECT codice_ean,nome_promozione FROM promozioni_m_x_n UNION SELECT codice_ean,nome_promozione FROM promozioni_per_data ) AS T

La tabella derivata è l'unione delle due.
Di qui tutti gli altri errori.

di alias te ne basta uno

Tutte le prove che fai da qui in poi hanno un eccesso di parentesi (che impone al parser di considerare alcune query come derivate).

La struttura è sempre la medesima:

SELECT ALIAS.CAMPI
FROM
(TABELLA DERIVATA) AS ALIAS

TABELLA DERIVATA può essere una sottoquery (come nel nostro esempio).

Dai un'occhiata a questo esempio:
/* NO - manca l'alias all'effettiva tabella derivata */ SELECT * FROM ( (SELECT id FROM Uno) UNION (SELECT id FROM Due) ) /* NO - manca l'alias all'effettiva tabella derivata */ SELECT * FROM ( SELECT id FROM Uno UNION SELECT id FROM Due ) /* NO - alias nei posti sbagliati */ SELECT * FROM ( SELECT id FROM Uno AS T1 UNION SELECT id FROM Due AS T2 ) /* SI' */ SELECT T.* FROM ( (SELECT id FROM Uno) UNION (SELECT id FROM Due) ) AS T /* SI' */ SELECT T.* FROM ( SELECT id FROM Uno UNION SELECT id FROM Due ) AS T /* SI' - alias in esubero ma corretti */ SELECT T.* FROM ( SELECT id FROM Uno AS T1 UNION SELECT id FROM Due AS T2 ) AS T


>Sarò grato a chiunque mi dia una mano in queste sante e benedette
>query annidate...
di nulla!

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5