Newsgroup: it.comp.lang.visual-basic
Titolo: Collegare 4 tabelle con JOIN

Salve a tutti, sono alle prime armi con la gestione di database query ecc..
Vi chiedo aiuto per creare una query.
Ho un database access formato da varie tabelle che per semplicità 
ipotizziamo abbiano tre
campi ciascuna. Avremo quindi:
TAB1.C1 TAB1.C2 TAB1.C3  TAB2.C1 TAB2.C2 TAB2.C3  TAB3.C1 TAB3.C2 TAB3.C3 
TAB4.C1 TAB4.C2 TAB4.C3
il campo TAB1.C1  (ha una relazione) con TAB2.c1
il campo TAB1.c1 (ha una relazione) con TAB3.C1
il campo TAB3.c1 (ha una relazione) con TAB4.c1
spero il termine relazione sia esatto, intendo dire ad esempio che
per ogni record di TAB1 e di TAB2 i campi TAB1.c1 e TAB2.c1 sono uguali
Dovrei quindi selezionare alcuni record (all' interno di due date usando 
come campo data
un campo di TAB1)e riempire per esempio un datagrid con tutti i campi da me 
selezionati dalle diverse tabelle
(per esempio TAB1.C1 TAB1.C2 TAB2.C2 TAB3.C3 TAB4.C2) ovviamente dello 
stesso record relazionato a
tutte e tre le tabelle.
Ho provato ad usare INNER JOIN ma mi funziona solo con 2 tabelle forse
perchè la TAB4 non ha una relazione con la TAB1 ma solo con la TAB3 ?
Scusate mi rendo conto della richiesta un pò contorta ma non saprei come 
spiegare meglio,
Grazie anticipatamente

 Grazie anticipatamente
Sforzati perchè cosi non si capisce niente :-) 

 
se avessi postato la query sarei stato un po piu' preciso, ma...
vediamo quello che si puo fare!
INNER JOIN serve a combinare i record in cui il campo della relazione e' 
presente in entrambe le tabelle, percio', se un record di TAB1 ha un 
campo c1 con un valore che *non e'* presente anche in TAB2, non viene
considerato.
l'alternativa e' (LEFT | RIGHT) OUTER JOIN
bye
r

 perchè la TAB4 non ha una relazione con la TAB1 ma solo con la TAB3 ?
Innanzitutto, non puoi chiedere aiuto su una query che non ti funziona, 
e non postarla.
Se l'avessimo avuta sottomano, probabilmente il problema sarebbe 
saltato subito all'occhio.
In linea di massima, comunque, giusto per buttare lì un'ipotesi, 
considera che Access è molto sfigato nella gestione dei Join, e non 
riesce a concepire un Join con più tabelle.
Occorre quindi 'ingannarlo' innestando i Join
FROM ((Tab1 Join Tab2) Join Tab3) Join Tab4
Se non è questo il caso, posta la query e riproviamo.
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 Alberto
Ciao,
penso che il problema si risolva 'innestando' i JOIN infatti
la TAB1 ha un campo in comune con TAB2 e anche con TAB3 ma non ha un campo
in comune con la TAB4 che quest'ultima ha un campo in comune con TAB3
quindi la TAB4 deve avere un JOIN con la TAB3, la TAB1 deve avere JOIN con
TAB2 e TAB3
non so come scrivere la sintassi corretta per fare questo.
Cmq oggi posto la query (ce l' ho nel pc portatile...)
Intanto Grazie

 TAB2 e TAB3
Non è un discorso logico.
Cioè, il fatto che i 'campi in comune' (come li chiami tu, in realtà 
sono chiavi e chiavi esterne) siano in una o in un'altra tabella è 
assolutamente indifferente (esiste solo qualche strana concatenazione 
se usi insieme Inner e Outer join, ma basta saperlo e si gestisce.
E' solamente un discorso sintattico. In qualunque altro dbms puoi fare 
millemila join senza alcuna parentesi (come è giusto e logico che sia).
Ciao


Allora provo a postare la query:
Le tabelle sono:
Scheda
ValoriScheda
Clienti
Persona
Scheda ha una chiave (campo IdScheda) in comune con Valorischeda (campo 
CodiceScheda)
e la stessa chiave (campo IdScheda) in comune con Clienti (campo 
CodiceScheda)
mentre la tabella Clienti ha una chiave in comune (campo IdClienti) con la 
Tabella Persona (campo CodicePersona)
QR = "SELECT  Scheda.IdScheda, Scheda.SchedaS, Scheda.Data, 
ValoriScheda.giorno, Valorischeda.mese, Clienti.CodiceCliente,
Persona.Nome, Persona.cognome
From
(Scheda INNER JOIN
(Valorischeda INNER JOIN
(Clienti INNER JOIN
(Persona ON Persona.CodicePersona = Clienti.IdClienti)
ON ValoriScheda.CodiceScheda =  Clienti.CodiceScheda)
ON Scheda.IdScheda = ValoriScheda.CodiceScheda)
WHERE Scheda.data between #" & Format$(lblDataInizio.Caption, "mm,dd,yyyy")
& "#and#" & Format$(lblDataFine, "mm,dd,yyyy") & "#ORDER BY 
scheda.schedas,scheda.sottoscheda;"
Considerate di scrivere il tutto su una riga solo

 scheda.schedas,scheda.sottoscheda;"
Non specifichi quale sia il malfunzionamento.
Cioè, se ti dà errore, quale errore?
Se non dà errore, ma non fa ciò che vuoi, cosa fa?
A me sembra strano che tu abbia messo le parentesi in quel modo (io 
avevo scritto una cosa diversa, hai provato?).


 ha scritto nel messaggio 
news:mn.4b2d7d616...@hotmail.com...


 ON Scheda.IdScheda = ValoriScheda.CodiceScheda)
prova cosi':
FROM ((Scheda INNER JOIN ValoriScheda
        ON Scheda.IdScheda = ValoriScheda.CodiceScheda)
        INNER JOIN Clienti
        ON Scheda.IdScheda = Clienti.CodiceScheda)
        INNER JOIN Persona
        ON Clienti.IdClienti = Persona.CodicePersona
bye
r

 Ci possiamo sentire in privato alla tua email ?
No.
Questo è un NG, potrebbe esserci qualcuno interessato.


         ON Clienti.IdClienti = Persona.CodicePersona
Che è esattamente quello che gli ho suggerito io, ma dice che non 
funziona.
Probabilmente c'è qualcosa d'altro (e, comunque, finchè non proverà le 
query in una finestrella SQL di Access, faticherà parecchio a vedere il 
problema).
Ciao


La query corretta e funzionante č:
FROM(Scheda INNER JOIN ValoriScheda ON Scheda.IdScheda = 
ValoriScheda.CodiceScheda) INNER JOIN(Persona INNER JOIN Clienti ON 
Persona.CodicePersona = Clienti.IdClienti) ON Scheda.IdScheda = 
Clienti.CodiceScheda;
Ora vado a avanti ma come ho detto inizialmente non sono molto esperto di 
database, quindi vi tornerň a disturbare
Grazie

 Clienti.CodiceScheda;
che sarebbe uguale a quella che ho postato io, solo che hai creato i 
collegamenti in un ordine diverso ;-)
bye
r