gibra ha scritto:
In ogni caso, il generatore di Access aiuta ma non sostituisce lo sviluppatore che deve avere le opportune conoscenze del linguaggio SQL, per ciò che si ripromette di ottenere.
Ovviamente le conoscenze devono essere proporzionali al grado di complessità che richiede il risultato desiderato.
Una cosa è scrivere una query che coinvolga 2/3 di tabelle.
Tutt'altra cosa è scrivere query complesse che coinvolgono molte più tabelle perchè in tal caso nel 99% dei casi entrano in gioco altri fattori come ad esempio le funzioni di aggregazione, le sotto-query, HAVING, GROUP BY (sapere quando usare una o l'altra), e così via.
Sto leggendo qualcosa sull'SQL, ma l'unica guida che ho è la guida in linea di Microsoft Ho scritto che non conosco l'SQL perché non l'ho mai messo in pratica, conosco le prime cose a livello teorico. Ma se devo usare qualche funzione un po' più complessa la studierò, no problem
In questo caso, comunque, credo non servano HAVING e GROUP BY, più giù ho spiegato un po' meglio cosa mi serve in particolare.
Bomberdini ha scritto:
peppe444 ha scritto:
gibra ha scritto:
Ti consiglio di usare il generatore di query di MSAccess:
trascini una tabella per volta ed imposta la relazione; se le hai già relazionate non serve nemmeno quello.
Ci ho già provato, ma la query non funziona
Le relazioni tra le tabelle le ho già impostate tutte.
Sei sicuro che nelle tabelle ci siano dati che soddisfano il join?
[...]
Morale della favola, assicurati che nelle tabelle che relazioni ci siano dati che si accoppiano
Grazie per l'esempio, chiarissimo. Un po' di linguaggio SQL lo conosco, comunque, quindi se fai prima a scrivere in SQL non ti fare problemi!
Dunque, credo che il problema stia proprio nel tipo di join che ho usato.
Nelle tabelle che metto in relazione ci sono dati che si accoppiano: infatti, se provo a creare le query singolarmente, funzionano benissimo.
Cerco di spiegare brevemente com'è strutturata questa parte del database:
si tratta di un database che ha lo scopo di catalogare degli Studi clinici (effettuati, ad es., per testare l'efficacia di un farmaco).
Ogni
studio è condotto su un
campione di pazienti affetti da una specifica
patologia e, eventualmente, da un'
altra patologia non esaminata dallo studio (inserita perché potrebbe alterarne i risultati).
La patologia è trattata con uno specifico
intervento che ha un esito (
outcome).
Le sei tabelle, quindi, sono:
StudioClinico; CampioneDiPazienti; Patologia; AltraPatologia; Intervento; Outcome.
Ho creato le tabelle, le ho messe in relazione (rispettando le cardinalità).
Dopo aver creato le maschere, ho inserito alcuni studi clinici per popolare il database, verificando che tutto funzionasse: le tabelle si riempiono correttamente, le chiavi esterne corrispondono ecc.
Creando singole query, ad esempio Studio_Patologia (restituisce l'elenco degli studi condotti sulle varie patologie), tutto funziona.
Ora, vorrei una query che mi restituisse l'elenco degli studi clinici, e che ogni record fosse costituito dai principali campi di tutte le tabelle.
Ogni record della query, cioè, dovrebbe indicarmi ogni specifico studio clinico (titolo, autore) condotto su uno specifico campione (con una dimensione), in merito al trattamento (e all'esito dello stesso) di una specifica specifica patologia.
In tal modo, a partire dalla query, posso filtrare tutti gli studi condotti su una patologia, per sapere, ad esempio, quali trattamenti sono stati utilizzati e quali hanno funzionato meglio.
Ho provato così:
SELECT [3A_Patologia].*, [1_CampioneDiPazienti].*, [2_Altra patologia].*, [4A_Intervento/Trattamento].*, [4B_Outcome].*, [5_StudioClinico].*
FROM ((((3A_Patologia INNER JOIN 5_StudioClinico ON [3A_Patologia].ID_Patologia = [5_StudioClinico].[Id patologia]) INNER JOIN (1_CampioneDiPazienti INNER JOIN OggettoStudiato ON ([1_CampioneDiPazienti].ID_Campione = OggettoStudiato.[Id campione]) AND ([1_CampioneDiPazienti].ID_Campione = OggettoStudiato.[Id campione])) ON ([5_StudioClinico].ID_Studio = OggettoStudiato.[Id studio]) AND ([5_StudioClinico].ID_Studio = OggettoStudiato.[Id studio])) INNER JOIN Affezione_CP ON ([3A_Patologia].ID_Patologia = Affezione_CP.[Id patologia]) AND ([1_CampioneDiPazienti].ID_Campione = Affezione_CP.[Id campione])) INNER JOIN ([2_Altra patologia] INNER JOIN Affezione_CAP ON [2_Altra patologia].ID_APatologia = Affezione_CAP.ID_Patologia) ON ([1_CampioneDiPazienti].ID_Campione = Affezione_CAP.ID_Campione) AND ([1_CampioneDiPazienti].ID_Campione = Affezione_CAP.ID_Campione)) INNER JOIN (4B_Outcome INNER JOIN ([4A_Intervento/Trattamento] INNER JOIN Mezzo ON [4A_Intervento/Trattamento].ID_Intervento = Mezzo.ID_Intervento) ON [4B_Outcome].ID_Outcome = [4A_Intervento/Trattamento].ID_Intervento) ON [3A_Patologia].ID_Patologia = Mezzo.ID_Patologia;
ma il risultato è questo:
http://img32.imageshack.us/img32/4344/spzd.pn
http://imageshack.us/a/img809/8875/hkk1.jp
Cosa sto sbagliando? Sbaglio nell'utilizzare la funzione INNER JOIN?
Non credo servano funzioni più "complesse", come HAVING e GROUP BY, in quanto non devo estrarre i record in base a un criterio, li devo "semplicemente" estrarre tutti. Ovviamente, i dati correlati devono comparire nello stesso record.
Se serve carico lo screen delle relazioni tra le tabelle (al di fuori della query).