Newsgroup: it.comp.www.asp
Titolo: Aiuto per una JOIN

Ho due tabelle UTENTI e ANAGRAFICA in SQL Server 2000
In UTENTI ho:
UTENTE_ID (identity)
ANAGRAFICA_ID (int)
NOME_UTENTE (varchar 50)
RUOLO (varchar 50)
In ANAGRAFICA ho:
ANAGRAFICA_ID (identity)
COGNOME (varhcar 100)
NOME (varchar 100)
COMUNE (varchar 100)
Ovviamente ho semplificato le tabelle con qualche campo e basta.
La relazione tra le due tabelle avviene attraverso il campo ANAGRAFICA_ID
Ho un form dove il client può fare delle ricerche sul DB attraverso un form
che richiede questi campi:
NOME
COGNOME
NOME UTENTE
RUOLO
Fino a qui sarebbe tutto normale se non fosse per il fatto che non tutti gli
utenti hanno un'anagrafica abbinata.
Molti utenti potrebbero avere in UTENTI.ANAGRAFICA_ID il valore (-1) che sta
ad indicare nessuna anagrafica associata.
La relazione dovrebbe funzionare in modo che se ad esempio il client
inserisce nella ricerca un valore per il campo NOME_UTENTE, il risultato
deve contenere tutti gli utenti che soddisfano quella condizione
(NOME_UTENTE) sia che abbiano un'anagrafica associata sia che non la
abbiano.
Allo stesso modo, se ad esempio il cliente fa una ricerca per COGNOME, tutti
gli utenti che NON hanno un'anagrafica associata o non soddisfano quella
condizione (COGNOME) NON devono apparire.
Io avevo provato con UTENTI.ANAGRAFICA_ID *= ANAGRAFICA.ANAGRAFICA_ID però
mi restituisce sempre e comunque tutti i record, quindi non va bene
Qualche suggerimento su una join corretta? Grazie.
--
:: Fate i bravi e non clonate le pecore!
:: Distractly yours... 
man...@audiopro.it

 che non la abbiano.
devi usare left/right outer join... in questo modo si porta dietro tutti i
record della tabella che ti interessa...
ciao
--
Lino Mari [mod - it.economia.e-commerce]
http://www.ebow.it
 - e-business on web!
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - d2D004
I veri problemi della vita saranno sicuramente cose che non t'erano mai
passate per la mente.

Non č cosě semplice. Cosě facendo se io inserisco come campo di ricerca
"COGNOME" un valore che non ha corrispondenti nella tabella ANAGRAFICA, mi
vengono restituiti cmq tutti i record della prima tabella, invece non deve
essere restituito nessun record (dato che non esiste nessuno con quel
cognome)
--
:: Fate i bravi e non clonate le pecore!
:: Distractly yours... 
man...@ufologia.net

 tabella, invece non deve essere restituito nessun record (dato che
ovviamente devi inserire un where...


-Cosě facendo se io inserisco come campo di
- ricerca "COGNOME" un valore che non ha corrispondenti nella tabella
- ANAGRAFICA,
Leggi come: WHERE ANAGRAFICA.COGOME LIKE 'cognomeinesistente'
- mi vengono restituiti cmq tutti i record della prima
- tabella (UTENTI), invece non deve essere restituito nessun record


Scusa Lino, sto facendo delle prove, probabilmente funziona. Mi sembra
ssurdo perchč essendo la cosa piů semplice č una delle prime che ho provato.
Sembra che facendo una semplice query con il QAnalyzer funzioni, adesso do
un'occhiata alla pag ASP che crea la querystring non vorrei che l'intoppo
fosse li... ti faccio sapere


[CUT]
Lino ti ha consigliato correttamente.
Poi, nella clausola WHERE devi filtrare quelli diversi da -1
Gusher.

La semplice LEFT JOIN funziona egregiamente. La cosa mi preoccupa e non
poco... dato che sicuramente è una delle prime prove che ho fatto.. forse
quando provo qualcosa (e non funziona) devo ripetere la prova almeno 3
volte! ;)
Grazie cmq per avermi spinto a riprovarci :) La cosa importante è non essere
mai sicuri di niente al 100% (questo è applicabile anche a molte altre
cose...hehehe)


 Scusa Lino, sto facendo delle prove, probabilmente funziona. Mi sembra
fammi sapere... perche' mi sembra di capire che la cosa sia abbastanza
semplice...


Funziona funziona. La cosa strana, ripeto, è che è la prima prova che ho
fatto.
A questo punto mi viene il dubbio che una join del tipo: "WHERE tab1.campo
*= tab2.campo" produca risultati completamente diversi da "FROM tab1 JOIN
OUTER LEFT tab2 ON tab1.campo = tab2.campo".
Questo nonostante l'operatore "*=" venga spacciato per un equivalente di
LEFT OUTER JOIN.
Invece utilizzando "*=" il risultato era che mi venivano COMUNQUE restituiti
tutti i record della prima tabella, risultato completamente diverso da
quello che ottengo con la forma ESTESA. Ecco svelato l'arcano.
Ciao


 di LEFT OUTER JOIN.
non saprei... non ho mai utilizzato quella sintassi... e soprattutto bisogna
vedere come la supporta il driver che utilizzi...
cmq... tutto e' bene cio' che finisce bene... io oggi ho finito
l'elaborazione di 1.400.000 records...:-)


".. io oggi ho finito
l'elaborazione di 1.400.000 records..."
Bisogna vedere quando hai iniziato ;)


 Bisogna vedere quando hai iniziato ;)
tra prove e controprove.. update incrociati con 3 tabelle... insert into...
left e right join... ho iniziato la scorsa settiamna...;-))))


Ciao a tutti, per questa sera mi sono limitato a leggere i vs. mexs e trovo
che siete molto preparati e disponibili. Sono lieto di essermi iscritto a
questo newsgroup e vi saluto. A presto.
Issigroup