2 messaggi dal 02 febbraio 2009
Salve a tutti,
sono nuovo del forum. Sto lavorando con Access ed ho il seguente problema: semplificando ho due tabelle

Tabella_Anagrafica:

Cognome
Nome
Codice_abilitazione


Tabella_Abilitazioni:

Codice_Abilitazione
Tipo_Abilitazione


Ad ogni utente possono corrispondere più abilitazioni.Il mio problema è che facendo una query come questa

Select Cognome, Nome, Tipo_Abilitazione
From Tabella_Anagrafica, Tabella_Abilitazioni
Where Cognome="Rossi"

compresa la JOIN che ora ho omesso, mi escono come risultati tanti rercord quante sono le abilitazioni e invece dovrei fare in modo che non fosse cosi perchè nel mio caso ci sarebbero molti campi oltre a nome e cognome che si ripeterebbero per più volte. Per capirci mi esce qualcosa come:

COGNOME NOME TIPO_ABILITAZIONE
Rossi Luca X
Rossi Luca Y
ROssi Luca Z
ecc..


Come posso risolvere? Per favore aiutatemi, non riesco a risolvere e il lavoro è molto urgente.

Grazie.
Marco
9 messaggi dal 08 gennaio 2007
Il problema nasce da TUTTE le combinazioni possibili che vengono generate per la MANCANZA della JOIN fra la prima e seconda tabella.

Penso che la query corretta sia:
Select Cognome, Nome, Tipo_Abilitazione
From Tabella_Anagrafica LEFT JOIN Tabella_Abilitazioni ON Tabella_Anagrafica.Codice_Abilitazione = Tabella_Abilitazioni.Codice_Abilitazione
Where Cognome="Rossi"

In questo caso ti può capitare
1. se una parsona abbia più ABITAZIONI e quindi hai più volte la stessa persona
2. se una persona ha una sola abitazione ha un record solo
3. se una persona NON ha un'abitazione viene il record ma senza l'abitazione.

Ora c'è da capire cosa ti DEVONO DIRE i DATI:
se la persona a Più TIPI ABITAZIONE
oppure
un elenco per persona dei TIPI ABITAZIONE assegnati

Se dai qualche info in più forse è più semplice darti una risposta.
2 messaggi dal 02 febbraio 2009
Ciao, grazie per la velocità. Mi serve sapere i tipi di abilitazione assegnati ad ogni persona senza però che ogni volta siano ripetuti il resto dei dati. Si risolve con la LEFT JOIN?
9 messaggi dal 08 gennaio 2007
Sarà una risposta LUNGA spero di non annoiarti e di esserti di aiuto
Facciamo un esempio con i dati in TABELLA

Tabella_Anagrafica:

Cognome - Nome - Codice_abilitazione
Rossi - Michele - X
Rossi - Michele - Z
Verdi - Giovanni - X
Verdi - Giovanni - Y
Verdi - Mario - X
Bianchi - Mario - Y


Tabella_Abilitazioni:

Codice_Abilitazione - Tipo_Abilitazione
X - monolocale
Y - bilocale
Z - trilocale

Se la domanda è quali abitazioni ha Rossi Michele la query è:
Select Cognome, Nome, Tipo_Abilitazione
From Tabella_Anagrafica LEFT JOIN Tabella_Abilitazioni ON Tabella_Anagrafica.Codice_Abilitazione = Tabella_Abilitazioni.Codice_Abilitazione
Where Cognome="Rossi"


In questo caso il risultato è
Cognome - Nome - Tipo_abilitazione
Rossi - Michele - monolocale
Rossi - Michele - trilocale

Attenzione all'abbinamento COGNOME e Nome se guardi nell'esempio di dati che ho inserito ci sono due persone (per esempio 2 fratelli) Mario e -giovanni che hanno lo stesso cognome Verdi. Nel caso in cui fai i filtro solo per il cognome.

Select Cognome, Nome, Tipo_Abilitazione
From Tabella_Anagrafica LEFT JOIN Tabella_Abilitazioni ON Tabella_Anagrafica.Codice_Abilitazione = Tabella_Abilitazioni.Codice_Abilitazione
Where Cognome="Verdi"


Il risultato sarà dato da

Cognome - Nome - Tipo_abilitazione
Verdi - Giovani - monolocale
Verdi - Giovanni - bilocale
Verdi - Mario - monolocale

In questo modo hai però un elenco e per avere il numero di LOCALI associati ad ogni persona devi contare i record altrimenti puoi utilizzare anche la CLAUSOLA GROUP BY. Altri esempi

Select Cognome, Nome, COUNT(Tipo_Abilitazione) as Numero_Tipo_Abitazioni
From Tabella_Anagrafica LEFT JOIN Tabella_Abilitazioni ON Tabella_Anagrafica.Codice_Abilitazione = Tabella_Abilitazioni.Codice_Abilitazione
Where Cognome="Verdi"
GROUP BY Cognome, Nome


In questo caso il risultato è
Cognome - Nome - Numero_Tipo_Abitazioni
Verdi - Giovani - 2
Verdi - Mario - 1

Se hai bisogno di altri chiarimenti fammi sapere.

Ciao
Modificato da info_DNNSERVICE il 03 febbraio 2009 00.16 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.