Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora query e sottoquery

 Oggo ho chiesto aiuto, subito aiutato, al ng per una quesry con sottoquery
sulle quali non sono molto ferrato. Io di solito quando ho questo problema,
usando acces faccio una query intemedia e su questa poi ci ffaccio qualla
finale. Il problema è che rimangono sul database e quando sono tante poi
dopo un poco neanche io capisco bene cosa facciano e a cosa servono.
Quindi riuscire a farne qualcuna con una stringa sql da mettere direttamente
nel codice vb mi aiuterebbe a tenere il database un poco piu pulito.
A dire il vero, questa brutta abitudine l'ho presa anche perchè da piu parti
avevo letto che query memorizzate nel db sono molto piu veloci di quelle
racchiuse nell'exe.
Stasera sto facendo delle prove per vedere come si può mettere in un'unica
query, senza esserci ancora riuscito, la seguente richiesta:
vorrei avere tutti i fornitori, una sola volta, con tutti i campi fornitore,
piu un campo calcolato sul conteggio di fatture pervenute, se ve ne sono
altrimenti zero.
Io questa la risolvo in 2 passaggi, ma in na volta sola come sarebbe?
Sto facendno delle prove ma non riesco a farla funzionare...
Grazie della pazienza
-- 
Greg

 ha scritto nel messaggio
news:eb05sn$eud$1...@area.cu.mi.it...

Ciao Greg,
guarda questo esempio.
----
SELECT Fornitori.*,
       Iif(IsNull(Ft.NrFatt),0,Ft.NrFatt) as NumeroFatture
FROM Fornitori
   LEFT JOIN
     (SELECT ID_FOR, Count(*) AS NrFatt
      FROM FattureF
      GROUP BY ID_FOR) AS Ft ON Fornitori.ID=Ft.ID_FOR
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 ----
Grazie, ho provato ma mi da "errore di join".
Ho provato in una maniera molto banale e funziona:
SELECT IdFornitore,Nominativo, ecc.... Count(Fatture.NumFattura) AS NFatt
FROM Fornitori LEFT JOIN Fatture ON Fornitori.IdFornitore =
Fatture.IdFornitore
GROUP BY Fornitori.IdFornitore, Fornitori.Nominativo;
Ma c'è il fastidio di elencare tutti i campi, e sono molti, sia nella select
che nella group by.
Se faccio la select fornitori* mi dice che non può fare la count
-- 
Greg

 Se faccio la select fornitori* mi dice che non puň fare la count
e sě, in questo caso devi elencare tutti i campi nella select e nella group
by.


 group by.
Invece si sono riuscito, e mi rendo conto che č piu banale di quel che
credevo:
SELECT Fornitori.*, (SELECT Count(Fatture.IdFattura) AS xx FROM fatture
where Fornitori.idFornitore = Fatture.IdFornitore) AS NumeroFatture
FROM Fornitori;
Grazie dell'aiuto, ciao
-- 
Greg

 ha scritto nel messaggio
news:eb2mlf$qtt$1...@area.cu.mi.it...

si ma cosě stai usando una subquery e non una tabella derivata.
Le prestazioni delle subquery in Access sono penose :-)
questa č uguale a quella che ho proposto prima, ho solo messo i nomi dei
tuoi oggetti.
----
SELECT Fornitori.*,
       Iif(IsNull(Fatt.xx),0,Fatt.xx) AS NumeroFatture
FROM Fornitori LEFT JOIN
   (SELECT IdFornitore,Count(IdFattura) as xx
    FROM fatture GROUP BY IdFornitore) AS Fatt
 ON Fornitori.idFornitore = Fatt.IdFornitore
----
in presenza di molti record č nettamente piů veloce.


 in presenza di molti record è nettamente più veloce.
Ti confesso che l'ho riprovata di nuovo, ma continua da darmi "errore
nell'operazione di join" e il gestore di quesry di access mi segna in
grassetto Fatt.xx.
Inoltre, non mi vergogno a dirlo, ma faccio proprio fatica a leggerla, non
la comprendo.
Mi sembra che join venga fatta tra una tabella e .... una colonna.
Ma senza dubbio sono io che sto guardando queste cose con un poco di
attenzione solo da un paio di giorni e quindi ho ancora tanto da studiare.
Ciao
-- 
Greg

 Ciao
se vuoi dare un'occhiata qui
----
Nozioni fondamentali sulle subquery
http://msdn2.microsoft.com/it-it/library/ms189575.aspx
Derived Tables
http://www.sqlservercentral.com/columnists/rmarda/derivedtablebasics_printversion.asp
----
sono per Sql Server ma il concetto è lo stesso anche per Access.


 
http://msdn2.microsoft.com/it-it/library/ms189575.aspx
Grazie, č prorpio quello che ci vuole.
-- 
Greg

 E' access 2000, ma non gli va bene la join :(
forse hai problemi di copia incolla :-)
qui trovi un db con un paio di tabelle e la query in questione
----
http://web.tiscalinet.it/giorgiorancati/msaccess/ng/testquery.zip
----


 qui trovi un db con un paio di tabelle e la query in questione
Eh si, adesso funziona, e sto pure cominciando a capire.
Grazie infinite.
-- 
Greg

 Grazie infinite.
SELECT Fornitori.*, IIf(IsNull([Fatt].[xx]),0,[Fatt].[xx]) AS NumeroFatture
FROM Fornitori LEFT JOIN [SELECT IdFornitore,Count(IdFattura) as xx
    FROM fatture GROUP BY IdFornitore]. AS Fatt ON Fornitori.IdFornitore =
Fatt.IdFornitore
Una curiosità: cosa significa quel punto dopo la quadra e prima di As Fatt?
E' indispensabile percè senza non funziona ma non capisco a cosa serva.
Ho saputo che il punto si come separatore tabella.campo ma davannti ad AS
che significato ha?
Grazie per pazienza e disponibilità
-- 
Greg

 Grazie per pazienza e disponibilità
Ciao Greg,
La sintassi SQL92 prevede le parentesi tonde come delimitatori delle tabelle 
derivate.
Come detto in precedenza, dalla versione di Access 2000 in avanti puoi 
scriverla così
----
SELECT Fornitori.*, IIf(IsNull([Fatt].[xx]),0,[Fatt].[xx]) AS NumeroFatture
FROM Fornitori LEFT JOIN (SELECT IdFornitore,Count(IdFattura) as xx
    FROM fatture GROUP BY IdFornitore) AS Fatt ON Fornitori.IdFornitore =
Fatt.IdFornitore
----
ma poi access ti cambia le parentesi tonde in quadre e aggiunge il punto 
dopo la quadra chiusa.
La sostituzione avviene per mantenere la stessa sintassi delle tabelle 
esterne al db corrente
esempio di tabella in altro db
----
SELECT *
FROM [Ms Access;Database=C:\Dati\Db1.Mdb].NomeTabella
----
esempio di tabella in cartella di Excel
----
SELECT *
FROM [Excel 8.0;Database=C:\Dati\Cartel1.xls].[Foglio1$]


 ----
Ciao Giorgio, scusa il ritardo :(
Tornando al punto... vedi anche tu che in tutti gli esempi che fai dopo il
punto c'è sempre un nome di campo o di tabella? Ho sempre visto il punto
come delimitatore di qualche cosa, ma nel nostro caso sembra un ...
terminatore, perchè subito dopo il punto segue un AS.
Cosa non considero?
-- 
Greg

 Cosa non considero?
non devi considerare niente :-)
La sintassi di Access è fatta così.
Se c'è qualcosa dopo il punto il contenuto delle quadre viene considerato 
come tabella esterna al database, per le tabelle derivate si mette il punto 
e basta, o meglio è Access che trasforma le parentesi tonde in quel modo.
Questa sintassi era già presente nella versione Access 2.0 e ovviamente 
viene mantenuta per retrocompatibilità


 per le tabelle derivate si mette il punto e basta
Benissimo, adesso è tutto chiaro.
Grazie ancora, ciao
greg