Newsgroup: it.comp.lang.visual-basic
Titolo: Inner Join (potete dare un'occhiata alla sintassi?)

Uso ADO e VB6 (dbase access '97)
Voglio unire tutte le mie tabelle per poter visualizzare in una griglia
tutti i miei dati.
Ho provato a far cosě:
rs.Open "SELECT * FROM " & _
        "(Tab_tipo INNER JOIN Tab_cd ON Tab_tipo.Id_tipo=Tab_cd.Id_tipo) " &
_
        "(Tab_cd INNER JOIN Tab_casadiscografica ON
Tab_cd.Id_casadiscografica=Tab_casadiscografica.Id_casadiscografica) " & _
        "(Tab_cd INNER JOIN Tab_canzoni ON
Tab_cd.Id_titolo=Tab_canzoni.Id_titolo) " & _
        "(Tab_canzoni INNER JOIN Tab_genere ON
Tab_canzoni.Id_genere=Tab_genere.Id_genere) " & _
        "(Tab_canzoni INNER JOIN Tab_autore ON
Tab_canzoni.Id_autore=Tab_autore.Id_autore) " & _
        "(Tab_autore INNER JOIN Tab_nazioni ON
Tab_autore.Id_nazione=Tab_nazioni.Id_nazione) "
Ma mi da errore di sintassi. Forse uso una sintassi che non c'entra niente
ma ho cercato di attenermi a quanto scritto su msdn ma fra parentesi tonde e
quadre credo di aver fatto un po' di confusione.
Naturalmente non č che sia un professionista di vb, faccio dei programmini
solo per diletto.
Grazie

 quadre credo di aver fatto un po' di confusione.
In questi casi, č indispensabile visualizzare la query SQL indipendentemente
dal codice VB, altrimenti si fa solo confusione.
Comunque, analizzando quanto hai postato, si vede che:
1) Il join comprende complessivamente 7 tabelle
2) Fai dei join stranissimi, ossia unisci a due a due le tabelle, ma non
unisci fra di loro le diverse coppie
3) Usi 6 Inner Join esplicitati
4) Usi 6 Full Outer Join impliciti (mancano solo le virgole, poi sarebbero
completi)
Premetto che non uso Access, per cui non conosco eventuali limitazioni
sintattiche di questo DB, perň nel caso i join siano tutti inner, le
parentesi e la ripetizione di una stessa tabella piů volte nella clausola
From sono assolutamente non necessari.
Lo stesso concetto di inner join č indipendente dalle parentesi. Esistono
solo alcuni rarissimi casi, in cui si utilizzi un misto di Inner e Outer
join, in cui l'ordine e le parentesi sono necessarie.
Al limite, volendo tener buona la sintassi che hai usato, dovresti mettere
le virgole fra le parentesi che separano le varie coppie di join. Questo
perň ti genera un prodotto cartesiano fra le viste risultanti dai singoli
join, per cui sei poi obbligato a mettere condizioni di join 'vecchio stile'
nella clausola Where. E, non avendo tu usato alcun alias per distinguere due
occorrenze diverse della stessa tabella in join diversi, non riusciresti
neppure a determinare i campi di join.
Diciamo, sostanzialmente, che una clausola From scritta come l'hai scritta
tu, č una cosa assolutamente senza senso. Ma non da un punto di vista
sintattico, bensě da un punto di vista logico.
Da un punto di vista logico, infatti, la sintassi corretta č:
Select * from
Tab1 Inner Join Tab2 On Tab1.Id=Tab2.Id
Inner Join Tab3 On Tabx.Id=Tab3.Id
Inner Join Tab4 On Tabx.Id=Tab4.Id
Inner Join Tab5 On Tabx.Id=Tab5.Id
Inner Join Tab6 On Tabx.Id=Tab6.Id
Inner Join Tab7 On Tabx.Id=Tab7.Id
Se Access presenta delle limitazioni di sintassi e richiede le parentesi, al
limite esse dovranno essere annidate, tipo
Select * from
(((((Tab1 Inner Join Tab2 On Tab1.Id=Tab2.Id)
Inner Join Tab3 On Tabx.Id=Tab3.Id)
Inner Join Tab4 On Tabx.Id=Tab4.Id)
Inner Join Tab5 On Tabx.Id=Tab5.Id)
Inner Join Tab6 On Tabx.Id=Tab6.Id)
Inner Join Tab7 On Tabx.Id=Tab7.Id
Se si tratta solo di Inner Join, cosě funziona tutto. Perň nel tuo esempio
tu riportavi 6 Inner Join e 6 Full Outer Join, per cui non vorrei aver
frainteso cosa ti serve.
Ciao
Alberto

Non so come ringraziarti... grazie al tuo aiuto sono riuscito a far quel che
volevo.
Non so a chi potrà interessare però alla fine è venuta una query così:
rs.Open "SELECT * FROM " & _
        "((((((Tab_tipo INNER JOIN Tab_cd ON
Tab_tipo.Id_tipo=Tab_cd.Id_tipo) " & _
        "INNER JOIN Tab_casadiscografica ON
Tab_cd.Id_casadiscografica=Tab_casadiscografica.Id_casadiscografica) " & _
        "INNER JOIN Tab_canzoni ON Tab_cd.Id_titolo=Tab_canzoni.Id_titolo) "
& _
        "INNER JOIN Tab_genere ON
Tab_canzoni.Id_genere=Tab_genere.Id_genere) " & _
        "INNER JOIN Tab_autore ON
Tab_autore.Id_autore=Tab_canzoni.Id_autore) " & _
        "INNER JOIN Tab_nazioni ON
Tab_autore.Id_nazione=Tab_nazioni.Id_nazione)"
Ciao e ancora grazie