Newsgroup: it.comp.lang.visual-basic
Titolo: Query su 4 tabelle

 Qando devo fare delle query su + tabelle e per giunta con relazioni M:M
vado in crisi, non ho ancora compreso il problema.
Provo ad mettere qui le tabelle interessate, sperando che si capisca.
Ditte  1-M  Impiegati  1-M   DettCorsi  M-1  Corsi
IdDitta         IdImpiegato       IdCorso             IdCorso
Ditta            IdDitta               IdImpiegato        NomeCorso
Problema: devo estrarre tutti i NomeCorso con a fianco di ognuno quante
ditte  hanno mandato almeno 1 impiegato a quel corso.
-- 
Greg

 ha scritto nel messaggio 
news:ebg6n7$j16$1...@area.cu.mi.it...

SELECT Corsi.NomeCorso, Count(Ditte.Ditta) AS ContoDitte FROM Corsi INNER 
JOIN DettCorsi INNER JOIN Ditte INNER JOIN Impiegati ON Ditte.IDDitta = 
Impiegati.IDDitta ON DettCorsi.IDImpiegato=Impiegati.IDImpiegato ON 
Corsi.IDCorso= DettCorsi.IDCorso GROUP BY Corsi.NomeCors HAVING 
Count(Ditte.Ditta)>0
Ma non mi ci giocherei le palle...

 ha scritto nel messaggio
news:ebg6n7$j16$1...@area.cu.mi.it...

Ciao Gregm puoi fare così
----
SELECT NomeCorso,Count(IdDitta) as NrDitte
FROM (SELECT DISTINCT Corsi.NomeCorso, Ditte.IdDitta
      FROM Ditte INNER JOIN (Impiegati INNER JOIN (Corsi INNER JOIN
DettCorsi ON Corsi.IdCorso = DettCorsi.IdCorso) ON Impiegati.IdImpiegato =
DettCorsi.IdImpiegato) ON Ditte.IdDitta = Impiegati.IdDitta
      ) AS DrvTbl
Group By NomeCorso
----
se anche qui usi Access tieni presente che cambierà le parentesi tonde che
delimitano la tabella derivata in quadre.
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 Ma non mi ci giocherei le palle...
e fai bene perchè nella tua query il conteggio delle ditte viene
moltiplicato per il numero di dipendenti che hanno partecipato ai corsi e
per il numero di corsi a cui ha partecipato ogni singolo dipendente.
1 sola ditta con 3 dipendenti che hanno partecipato ognuno a due corsi,
rende il conteggio 6 e non 1.
:-)


 delimitano la tabella derivata in quadre.
Ciao Giorgio,
si uso sempre e solo Access, ho messo la quadra e pure il punto prima di AS 
DrvTbl, ormai ho imparato la regoletta :)
la query funziona, solo che il conteggio di IdDitta è leggermente superiore 
a quello che io ottengo con una serie di 4 query e di cui sono certo; adesso 
devo capire come mai e perchè.
In ogni caso quello che mi meraviglia ancora, e che io non so ancora 
purtroppo padroneggiare, è questa tecnica di estrarre dati da 4 tabelle con 
4 righe di codice sql :(  Oddio, ci riesco ma solo se le tabelle sono tutte 
1:N a cascata, appena c'è una N:N non mi ci trovo piu e qualunque risultato 
di prova è sempre un prodotto di records :(
Ciao
greg 

 di prova è sempre un prodotto di records :(
è solo una questione di esercizio :-)


 query :-)
Il risultato da ottenere lo hai compreso benissimo, e si vede anche da come 
hai scritto la query.
Ho fatto un controllo manuale e visivo direttamente sulle tabelle, visto che 
ancora i dati sono pochissimi records di prova, e ho capito dove sta 
l'inghippo. In pratica count(IdDitta)
SELECT NomeCorso,Count(IdDitta) as NrDitte
restituisce il conteggio degli impiegati e non delle ditte, che è poi il 
problema che incontro io cercando di fare la quesry avvalendomi del solo 
query builder di access :(
ciao
greg

 query builder di access :(
no, restituisce il conteggio delle ditte perchè l'origine record della
tabella derivata espone i valori distinti di ogni ditta
----
SELECT NomeCorso,Count(IdDitta) as NrDitte
FROM (SELECT DISTINCT Corsi.NomeCorso, Ditte.IdDitta
ecc ecc
----
una ditta con dieci dipendenti che partecipano a un corso viene conteggiata
una sola volta.
Per abitudine provo sempre le soluzioni prima di suggerirle.


 Per abitudine provo sempre le soluzioni prima di suggerirle.
Hai ragione tu, scusami, sbagliavo io nell'adattare il codice alla mia 
realtà :(
Ringrazio e chiedo venia.
greg 

 [Office Access MVP]
Certo che hai delle pessime abitudini....!
;-)
@Alex

 ;-)
LOL
:-)


 @Alex
Ricevuto :)
Cercherò di approfittare di meno della bontà e disponibilità di giorgio
rancati che ringrazio ancora.
Ciao
-- 
Greg

greg ha scritto:

Scusa Greg non era rivolta a te la battuta, ma proprio a Giorgio con il
quale mi sono permesso una battuta confidenziale vista la datata
frequentazione dei NG comuni...!
Ciao e scusa l'eventuale fraintesa.
@Alex