Discussione:
inner join
(troppo vecchio per rispondere)
Donato
2005-07-01 09:39:16 UTC
Permalink
salve ho due tabelle
tb1 e tb2

mediante una select prendo dei campi da tb1 e campi da tb2 tutto questo
sfruttando una inner join fin qui tutto ok
se prero alcune volte tbl2 non trova i dati che rispettano la select succede
in questione pur essendo presenti nella tbl1, il resulset della select
rimane vuota

per fare un esempio:

tbl1
id
Nome
Cognome

tbl2

id
Indirizzo
CAP

SELECT tbl1.*, tbl2.* from tbl1 inner join tbl2 on tbl1.id=tbl2.id where
tbl1.nome="Marco"

ora se per ipotesi Marco esiste come nominativo, ma non ha ancora
l'indirizzo, la select in questione giustamente mi non mi da niente,
la domanda è:
esiste un metodo per ottenere comunque informazioni parziali in questo caso
nome e cognome pur non essendo presente per esempio l'indizzo nella seconda
tbl2, magari anche inserendo una valore di default per i campi che non è
riuscito a prelevare (tipo null o non presente)?

la soluzione sarebbe di fare due select distinte ma ricordo che a me serve
poi passare il resultset in una grid in aspnet e non credo poterlo fare in
due tempi dato che la grid si aspetta il resultset della select completo

spero die essere stato chiaro
grazie
Donato
Andrea Benedetti
2005-07-01 09:47:06 UTC
Permalink
Salve Donato,
Post by Donato
salve ho due tabelle
tb1 e tb2
mediante una select prendo dei campi da tb1 e campi da tb2 tutto questo
sfruttando una inner join fin qui tutto ok
se prero alcune volte tbl2 non trova i dati che rispettano la select
succede in questione pur essendo presenti nella tbl1, il resulset della
select rimane vuota
[cut]
Post by Donato
esiste un metodo per ottenere comunque informazioni parziali in questo
caso nome e cognome pur non essendo presente per esempio l'indizzo nella
seconda tbl2, magari anche inserendo una valore di default per i campi che
non è riuscito a prelevare (tipo null o non presente)?
Prova con un: LEFT OUTER JOIN
Ovvero:

SELECT tbl1.*, tbl2.*
from tbl1 LEFT OUTER JOIN tbl2
on tbl1.id=tbl2.id where
tbl1.nome="Marco"
Post by Donato
spero die essere stato chiaro
grazie
Donato
HTH,
Andrea
Lorenzo Benaglia
2005-07-01 09:55:46 UTC
Permalink
Post by Donato
esiste un metodo per ottenere comunque informazioni parziali in
questo caso nome e cognome pur non essendo presente per esempio
l'indizzo nella seconda tbl2, magari anche inserendo una valore di
default per i campi che non è riuscito a prelevare (tipo null o non
presente)?
Certo Donato,

oltre alle INNER JOIN esistono le OUTER JOIN.
Nel tuo caso potresti utilizzare una LEFT OUTER JOIN (spesso abbreviata in
LEFT JOIN) che restituisce *tutte* le righe della tabella di sinistra
(tbl1), non solo quelle per cui esista una corrispondenza anche nella
tabella di destra (tbl2); quando una riga nella tabella di sinistra non ha
una una o più righe corrispondenti nella tabella di destra, la riga
risultante del result set avrà le colonne specificate nella select list
della tabella di destra valorizzate a NULL:

SELECT tbl1.*, tbl2.*
FROM tbl1 LEFT JOIN tbl2
ON tbl1.id =t bl2.id
WHERE tbl1.nome='Marco'

Come sempre trovi tutte le informazioni del caso sui Books Online:

"Types of Joins"
http://msdn.microsoft.com/library/en-us/vdtsql/dvcontypesofjoins.asp
Post by Donato
grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Continua a leggere su narkive:
Loading...