Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query che usa dati da un'altra query.

26 views
Skip to first unread message

Riccardo Baldinotti

unread,
Sep 1, 2010, 4:23:23 AM9/1/10
to
La prima query "qElGiu1" è:

SELECT DISTINCT tCostiXLiv.Giu
FROM tCostiXLiv;

mentre la seconda "qElGiu2" è:

SELECT DISTINCT Sum(1) AS n, t1.Giu
FROM qElGiu1 AS t1 INNER JOIN qElGiu1 AS t2 ON t1.Giu>=t2.Giu
GROUP BY t1.Giu
ORDER BY t1.Giu;

e mi servono per avere un elenco numerato dei diversi valori di Giu,
che è un campo di testo, senza ripetizioni.
Si tratta di un esempio banale che mi dà modo di chiedere se per caso
non ci sia modo di nidificare le query, una bestemmia del tipo:

SELECT DISTINCT Sum(1) AS n, t1.Giu
FROM (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t1
INNER JOIN (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t2
ON t1.Giu>=t2.Giu
GROUP BY t1.Giu
ORDER BY t1.Giu;

che ovviamente non mi funziona.
Se poi devo essere scomunicato, pazienza.
Grazie a tutti.
Riccardo Baldinotti

OneEDP

unread,
Sep 1, 2010, 4:46:09 AM9/1/10
to
La correlazione la puoi ottenere inserendo all'interno della subquery
con una where utilizzando gli alias del tipo:

Select Distinct
T1.Giu, T1.QuelloChetpare
FROM tCostiXLiv As T1
Where
T1.Giu < (Select SoloUnCampo From tCostiXLiv As T2 Where T2.ID < >
= T1.ID)

--
Daniele
Rispondere scartando OneEDP, spam e 32

Karl Donaubauer

unread,
Sep 1, 2010, 4:58:17 AM9/1/10
to
> ...

Se capisco bene, puoi provarlo così:

SELECT DISTINCT
(SELECT COUNT(*) FROM
(SELECT DISTINCT Giu FROM tCostiXLiv) AS T2
WHERE T2.Giu <= T1.Giu) AS n
, T1.Giu
FROM tCostiXLiv AS T1
ORDER BY T1.Giu

--
Ciao
Karl
*********
Access FAQ: http://www.donkarl.com/it

Riccardo Baldinotti

unread,
Sep 1, 2010, 5:19:04 AM9/1/10
to
On 1 Set, 10:58, "Karl Donaubauer" <NoS...@donkarl.com> wrote:
>
> Se capisco bene, puoi provarlo così:
>
> SELECT DISTINCT
>   (SELECT COUNT(*) FROM
>       (SELECT DISTINCT Giu FROM tCostiXLiv) AS T2
>         WHERE T2.Giu <= T1.Giu) AS n
>   , T1.Giu
> FROM tCostiXLiv AS T1
> ORDER BY T1.Giu
>
...e naturalmente funziona, grazie mille.
Ma la cosa buffa è che anche la mia:

SELECT DISTINCT Sum(1) AS n, t1.Giu
FROM (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t1
INNER JOIN (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t2
ON t1.Giu>=t2.Giu
GROUP BY t1.Giu
ORDER BY t1.Giu;
adesso funziona: forse avevo fatto un errore a scriverla, ma è
comunque meno "elegante".

A questo punto chiedo: fra le tre soluzioni (le due query, la query
Karl, la query Riccardo) ci possono essere differenze di prestazioni?
Per esempio: nella soluzione a due query, mi pare che la prima sia
eseguita due volte.
Nel mio caso è un batter di ciglia, ma forse casi più complessi
potrebbero dare differenze, o no?

Per quanto riguarda la proposta di OneEDP, la tabella tCostiXLiv non
ha un campo id e ho modificato così:
Select Distinct
Sum(1) AS n, t1.Giu


FROM tCostiXLiv As T1
Where

T1.Giu < (Select Giu From tCostiXLiv As T2 Where T2.Giu <=
T1.Giu)
ma avevo l'errore "impossibile eseguire una query che non include
l'espressione 'Giu' come parte di una funzione di aggregazione".
Al che, aggiungendo:
GROUP BY t1.Giu;
ottengo:
"la sottoquery può restituire al massimo un record".

Ancora grazie.
Riccardo Baldinotti

OneEDP

unread,
Sep 1, 2010, 5:39:56 AM9/1/10
to
Il 01/09/2010 11.19, Riccardo Baldinotti ha scritto:
> On 1 Set, 10:58, "Karl Donaubauer"<NoS...@donkarl.com> wrote:
>> Se capisco bene, puoi provarlo così:
>>
>> SELECT DISTINCT
>> (SELECT COUNT(*) FROM
>> (SELECT DISTINCT Giu FROM tCostiXLiv) AS T2
>> WHERE T2.Giu<= T1.Giu) AS n
>> , T1.Giu
>> FROM tCostiXLiv AS T1
>> ORDER BY T1.Giu
>>
> ....e naturalmente funziona, grazie mille.
Ha ragione!
> Ancora grazie.
> Riccardo Baldinotti

Select Distinct
Sum(1) AS n, t1.Giu
FROM tCostiXLiv As T1
Where

T1.Giu< (Select Min o Max (T2.Giu) From tCostiXLiv As T2 Where T2.Giu<=
T1.Giu)
group by t1.giu

Karl Donaubauer

unread,
Sep 1, 2010, 7:06:48 AM9/1/10
to
Riccardo Baldinotti wrote:
> Karl Donaubauer wrote:
>> ...

>> SELECT DISTINCT
>> (SELECT COUNT(*) FROM
>> (SELECT DISTINCT Giu FROM tCostiXLiv) AS T2
>> WHERE T2.Giu <= T1.Giu) AS n
>> , T1.Giu
>> FROM tCostiXLiv AS T1
>> ORDER BY T1.Giu
>>
> ...e naturalmente funziona, grazie mille.
> Ma la cosa buffa č che anche la mia:

> SELECT DISTINCT Sum(1) AS n, t1.Giu
> FROM (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t1
> INNER JOIN (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t2
> ON t1.Giu>=t2.Giu
> GROUP BY t1.Giu
> ORDER BY t1.Giu;
> adesso funziona: forse avevo fatto un errore a scriverla, ma č

> comunque meno "elegante".
>
> A questo punto chiedo: fra le tre soluzioni (le due query, la query
> Karl, la query Riccardo) ci possono essere differenze di prestazioni?
> Per esempio: nella soluzione a due query, mi pare che la prima sia
> eseguita due volte.
> Nel mio caso č un batter di ciglia, ma forse casi piů complessi

> potrebbero dare differenze, o no?
> ...

In genere le sottoquery in Access/JET sono lente.
Soprattutto con molti record spesso č piů veloce di usare
due query separate o una funzione come DLookUp/DCount ecc.
invece di una sottoquery. (v.a. www.donkarl.com/it?FAQ3.11)

--
Ciao
Karl
*********
Access FAQ: www.donkarl.com/it


OneEDP

unread,
Sep 1, 2010, 9:52:59 AM9/1/10
to
Il 01/09/2010 11.19, Riccardo Baldinotti ha scritto:
> On 1 Set, 10:58, "Karl Donaubauer"<NoS...@donkarl.com> wrote:
>> Se capisco bene, puoi provarlo così:
>>
>> SELECT DISTINCT
>> (SELECT COUNT(*) FROM
>> (SELECT DISTINCT Giu FROM tCostiXLiv) AS T2
>> WHERE T2.Giu<= T1.Giu) AS n
>> , T1.Giu
>> FROM tCostiXLiv AS T1
>> ORDER BY T1.Giu
>>
> ....e naturalmente funziona, grazie mille.

> Ma la cosa buffa è che anche la mia:
> SELECT DISTINCT Sum(1) AS n, t1.Giu
> FROM (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t1
> INNER JOIN (SELECT DISTINCT tCostiXLiv.Giu FROM tCostiXLiv;) AS t2
> ON t1.Giu>=t2.Giu
> GROUP BY t1.Giu
> ORDER BY t1.Giu;
> adesso funziona: forse avevo fatto un errore a scriverla, ma è
> comunque meno "elegante".
>
> A questo punto chiedo: fra le tre soluzioni (le due query, la query
> Karl, la query Riccardo) ci possono essere differenze di prestazioni?
La differenza in termini di prestazioni, la devi valutare di volta in volta
In linea di massima occorrerebbe un indice composto di più campi (nello
stesso ordine) valutati nelle where e nelle join.
Ciò ne aumenta considerevolmente le prestazioni, ma nello stesso tempo
non significa crearli indisciminatamente.
Ciao

> Per esempio: nella soluzione a due query, mi pare che la prima sia
> eseguita due volte.
> Nel mio caso è un batter di ciglia, ma forse casi più complessi
> potrebbero dare differenze, o no?
>
> Per quanto riguarda la proposta di OneEDP, la tabella tCostiXLiv non
> ha un campo id e ho modificato così:
> Select Distinct
> Sum(1) AS n, t1.Giu
> FROM tCostiXLiv As T1
> Where
> T1.Giu< (Select Giu From tCostiXLiv As T2 Where T2.Giu<=
> T1.Giu)
> ma avevo l'errore "impossibile eseguire una query che non include
> l'espressione 'Giu' come parte di una funzione di aggregazione".
> Al che, aggiungendo:
> GROUP BY t1.Giu;
> ottengo:
> "la sottoquery può restituire al massimo un record".
>
> Ancora grazie.
> Riccardo Baldinotti
0 new messages