Creare una query con più tabelle

di
Anonimizzato12939
il
8 risposte

Creare una query con più tabelle

Salve a tutti, sono nuovo su questo forum!
Scrivo per cercare di risolvere un problema su cui sbatto la testa da un po' di tempo: premetto che conosco un po' le basi teoriche in merito alla struttura dei database; non conosco (almeno non ancora) il linguaggio SQL, ma se dovesse servire a risolvere il problema vedrò di impararlo.

Vorrei creare una query che contenga i dati provenienti da più tabelle, tra loro collegate con relazioni uno a uno, uno a molti e molti a molti.

Si tratta, in tutto, di sei diverse tabelle: vorrei poter visualizzare tutti i campi in un'unica query, in modo da poter selezionare, volta per volta, solo i record che mi interessano utilizzando lo strumento filtro (e non i criteri della query). In tal modo potrei consultare il database in modo più "dinamico".
Non so se si può fare, ma lo schema relazionale mi sembra concettualmente corretto.
Posto, di seguito, il link all'immagine dello schema relazionale:


Ho provato creando delle query con due tabelle, poi delle query "di collegamento" per mettere insieme le query a due tabelle, con lo scopo di creare, infine, un'unica query a partire di quelle "di collegamento" ma, a parte il procedimento "poco elegante", non credo sia una strategia adatta perché, fondamentalmente, non funziona
Utilizzando quel poco che conosco di linguaggio SQL, invece, sono riuscito a mettere insieme, al massimo, tre tabelle...

Vi ringrazio anticipatamente per l'aiuto!
Buon weekend

8 Risposte

  • Re: Creare una query con più tabelle

    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.
  • Re: Creare una query con più tabelle

    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. Creo la query in visualizzazione struttura, visualizzo le tabelle che mi servono, seleziono i campi che mi interessano dalle varie tabelle, senza aggiungere alcun criterio. Salvo la query. Quando la eseguo, però, non mi dà alcun risultato e, a differenza delle query "funzionanti" del database, le caselle sembrano essere "inattive": cliccandoci sopra non mi visualizza il cursore lampeggiante.
    Non capisco cosa sbaglio...
    Teoricamente, se non seleziono alcun criterio, non dovrebbe visualizzarmi tutti i risultati della tabella?

    PS: avevo pensato anche alla funzione UNION per creare una query unione ma, da quanto ho capito,
    Le query di selezione combinate in una query di unione devono avere lo stesso numero di campi di output, nello stesso ordine e con tipi di dati uguali o compatibili.
    (dalla guida in linea di Access 2007)
    mentre io devo collegare in un'unica query tabelle con campi diversi.
  • Re: Creare una query con più tabelle

    Lo schema dell'immagine che hai postato ci dice tutto e nulla. In Access il look della finestra Relazioni è molto diversa. Occorrerebbe vedere nei dettagli cosa hai combinato. In linea generale, una query in visualizzazione struttura va compilata così:
    1. Apri una Nuova Query in visualizzazione struttura
    2. Mostra la lista tabelle e Importa quelle che interessano. Quelle che interessano devono avere relazioni coerenti, altrimenti il tutto non funziona (ripeto occorrerebbero più dettagli specifici nella tua descrizione)
    3. Trascinare nella griglia i campi che interessa vedere
    4. (Facoltativo) aggiungere eventuali criteri.
    5. Salva e/o esegui la query.
  • Re: Creare una query con più tabelle

    peppe444 ha scritto:


    Ci ho già provato, ma la query non funziona
    Secondo te, noi cosa possiamo capire da questa affermazione???
    Assolutamente nulla.

    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.

    La UNION in questo contesto non c'azzecca nulla.
  • Re: Creare una query con più tabelle

    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?

    Leggo che non conosci sql quindi cerco di spiegarmi con un esempio...

    Se tu hai 2 tabelle : TabA, TabB con attributi rispettivamente idA e idB

    Se fai una query che prende i dati delle 2 tabelle, supponi di avere : idA = 1;2;3
    e idB = 4;5;6

    ovviamente la query che fa il Join su idA e idB non ti restituira risultati perche' nessun record matcha.

    Se invece avessi :
    idA = 1;2;3
    idB = 0;1;4

    La query ti restituirebbe "1" perche' e l'unico che compare in entrambe le tabelle e che quindi soddisfa il join.

    Morale della favola, assicurati che nelle tabelle che relazioni ci siano dati che si accoppiano
  • Re: Creare una query con più tabelle

    Bomberdini ha scritto:


    peppe444 ha scritto:


    matcha
    che lingua è ?
  • Re: Creare una query con più tabelle

    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).
  • Re: Creare una query con più tabelle

    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

    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;
    
    [/quote]

    ripeto hai verificato che TUTTI i join siano soddisfatti??
    ad esempio nella tua query : INNER JOIN 5_StudioClinico ON [3A_Patologia].ID_Patologia = [5_StudioClinico].[Id patologia]) si verifica?

    oppure : INNER JOIN Affezione_CAP ON [2_Altra patologia].ID_APatologia = Affezione_CAP.ID_Patologia) si verifica?

    eccetera
Devi accedere o registrarti per scrivere nel forum
8 risposte