Query da più tabelle

domenica 21 giugno 2015 - 17.44
Tag Elenco Tags  Access (.mdb)  |  Office 2003

marcellino Profilo | Newbie

buongiorno, ho la necessità di estrapolare da 3 tabelle una unica query.
premetto che il programma si basa su una tabella "servizi" dove sono elencati i tipi di servizi da svolgere (località, durata, compenso ecc.) una tabella "medici" (che riguarda appunto i dati personali dei medici) e una tabella "inservienti" (che riguarda i dati personali degli inservienti . molto diversa da quella dei medici)
la tabella servizi l'ho messa in relazione uno a molti sia con la tabella medici che con quella inservienti.
l'output sarebbe un foglio servizi con la descrizione del servizio e l'elenco di 3 medici e 10 inservienti.
grazie marcello

pieroalampi Profilo | Expert

Ciao e dimmi cosa esattamente vuoi sapere, se le tre tabelle sono in relazione puoi fare una inner join se non lo sono puoi fare una cross join, di fatto dovresti mettere un campo per ogni tabella e fare la domanda in modo più esplicito.
Esempio:
ho due tabelle una chiamata clienti da dove devo estrapolare il nome del cliente ed una seconda chiamata fatture da dove devo estrapolare in numero della fattura per ogni fattura, questa è la stringa sql per estrapolare i dati con una INNER JOIN, dove indichi quale è il campo identico che crea la relazione in tutte e due le tabelle, in questo caso (ClientiFornitori.ID_Cliente = Fatture.ID_Cliente)

SELECT ClientiFornitori.R_Cliente, Fatture.R_NumeroDocumento FROM ClientiFornitori INNER JOIN Fatture ON ClientiFornitori.ID_Cliente = Fatture.ID_Cliente

chiaro?
qui qualche delucidazione sulle inner join

http://www.w3schools.com/sql/sql_join_inner.asp

https://technet.microsoft.com/it-it/library/ms190014(v=sql.105).aspx

ciao
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

marcellino Profilo | Newbie

vorrei conoscere come scrivere per ottenere un servizio da svolgere con tutti i nomi dei medici e degli inservienti. quali altri elementi posso darti per essere più chiaro?

pieroalampi Profilo | Expert

guarda mi dovresti postare le strutture delle tabelle, ma in ogni caso non è difficile cerca di capire quello che ti ho scritto da li puoi arrivare, l'importante è che le tabelle da mettere in relazione hanno tutte quante un punto di congiunzione,
Se ho capito bene tutti i medici e gli inservienti dovranno svolgere dei servizi e tu vuoi elencarli, secondo me devi creare una tabella anagrafica servizi, una anagrafica medici ed una anagrafica inservienti,nella tabella servizi ovviamente avrai come indice e campo intero univoco ad autoincremanto per una sola unità il campo IDServizi e nelle tabelle anagrafica medici e inservienti come punto di giunzione avrai anche li un campo intero ma non indice che di chiamerà IDServizi e questo campo sarà riempito dall'id del servizio corrispondente a quello di ogni medico/inserviente.
esempio tabella

TabAnagraficaServizi
campo IdServizio (univoco,indice,autoincremento)
R_DescrizioneServizio (qui inserisci la descrizione del servizio)

TabAnagraficaMedico
campo IdMedico (univoco,indice,autoincremento)
R_NomeMedico
R_CognomeInserviente
IdServizio

TabAnagraficaInserviente

campo IdInserviente(univoco,indice,autoincremento)
R_NomeInserviente
R_CognomeInserviente
IdServizio
a questo punto hai le tre tabelle dalla tabella servizi puoi ricavare tramite una inner join i servizi corrispondenti ad ogni medico o inserviente
se sono al pc ti rispondo altrimenti domani sarò fuori sede da un cliente al massimo ritarderò di 1 o 2 giorni
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

marcellino Profilo | Newbie

ecco la query che ho provato a comporre. in allegato ti mando lo schema delle relazioni.
grazie

SELECT nome_servizio, tipo_servizio, durata, localita, nome_ospedale, data_servizio, cognome_med, nome_med, specializzazione, cognome_inserv, nome_inserv, cooperativa
FROM servizi, medici, inservienti
WHERE id_servizi=ks_servizi AND id_servizi=ks_servi;



962x600 280Kb

ysdemarc Profilo | Expert

Query orrenda...

Sarebbe opportuno che quando metti in relazioni più tabelle utilizzi i nomi di tabella o gli alias.

In questa query non si capisce quale campo appartiene a chi, e se ci fossero 2 campi con nome identico? sicuramente andrebbe in errore.

e se una tabella non ha alcun dato per quella chiave i dati vanno comunque selezionati o no?

Devi sapere che in SQL puoi relazionare le tabelle con

INNER JOIN mette in relazione le tabelle e tutte devono avere i dati per quella chiave
LEFT JOIN prende tutti dati della tabella di sinistra e solo quelli con chiave uguale dalla tabella di destra (quello che non ha corrispondenze rimane a NULL)
RIGHT JOIN come la precedente ma inversa
FULL OUTHER JOIN prende tutto di tutto delle tabelle (quello che non ha corrispondenze rimane a NULL)
CROSS JOIN relaziona le tabelle una riga a molte

Queste sono quelle di utilizzo più comuni.

Qundi una select la faresti tipo:

SELECT A.Campo AS Campo1 , B.Descrizione , B.Campo AS Campo2 , NZ(C.Importo,0) AS Totale FROM ( ( TABELLA1 A INNER JOIN TABELLA2 B ON A.Chiave = B.Chiave ) LEFT JOIN TABELLA3 C ON C.Chiave = A.Chiave AND C.SUBChiave = B.SUBChiave ) WHERE C.Chiave = 'abcd'

Da notare le parentesi necessarie in access

quindi la tua query io la riscriverei in questo modo:

SELECT S.nome_servizio , S.tipo_servizio , S.durata , S.localita , S.nome_ospedale , S.data_servizio , M.cognome_med , M.nome_med , M.specializzazione , I.cognome_inserv , I.nome_inserv , I.cooperativa FROM ( ( servizi S INNER JOIN medici M ON S.ID_Servizi = M.KS_Servizi ) INNER JOIN inservienti I ON S.ID_Servizi = I.KS_Servi )

Ho messo gli INNER JOIN ma credo che forse sarebbe necessarie sostituirle con LEFT JOIN entrambe poichè magari qualche servizio non ha medico o inserivente associato o entrambi.

Vincenzo
Programmatore sbilenco
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5