Inner join suy piu tabelle

venerdì 09 novembre 2012 - 08.38

tigre Profilo | Junior Member

ho questa query su piu tabelle
"SELECT p.codice, p.COGNOME, p.NOME, pv.ORDINI, v.INVIATI
FROM dbo.CLIENTI AS p INNER JOIN
dbo.ORDINI AS pv ON p.CODICI = pv.CODICI INNER JOIN
EVASI AS v ON p.CODICE = v.CODICE
WHERE (p.CODICE = '1200')"
LA query mi fa visualizzare i dati se il CODICE ESISTE su tutte e 3 le tabelle
ma se in una tabella il record non esiste....non visualizza niente.

totti240282 Profilo | Guru

Dovresti usare una left Join se ricordo bene.
C'è solo un capitano !!!!!!

alx_81 Profilo | Guru

>Dovresti usare una left Join se ricordo bene.
non è tanto un discorso di left, ma di OUTER. E comunque quello che proponi risolve la problematica, tuttavia vorrei spiegare un po' più nel dettaglio la faccenda.
Le INNER join sono join che fanno intersezione e quindi, se un record della filiera non si lega con gli altri (tutti in INNER) la riga viene nascosta.
Per questo motivo devi capire qual è la tabella che potrebbe non avere un record di legame sulla condizione che hai disegnato e determinare chi tra le tabelle che stai legando sta a "destra" o "sinistra". In base a questo scegli se fare LEFT o RIGHT join.
Nel tuo caso, ipotizzando di avere almeno un cliente direi:

SELECT p.codice , p.COGNOME , p.NOME , pv.ORDINI , v.INVIATI FROM dbo.CLIENTI AS p LEFT JOIN dbo.ORDINI AS pv ON p.CODICI = pv.CODICI LEFT JOIN EVASI AS v ON p.CODICE = v.CODICE WHERE p.CODICE = '1200'

Ora c'è un secondo problema, i campi per cui il legame non si verifica vengono mostrati come NULL. Se hai un'applicazione a monte che legge, puoi decidere di lasciarli così e far gestire la problematica all'app stessa. Se invece vuoi dare un diverso valore in caso di NULL, puoi usare ISNULL o COALESCE in questo modo:

SELECT p.codice , p.COGNOME , p.NOME , ORDINI_NONNULL = ISNULL(pv.ORDINI, 0) , INVIATI_NONNULL = COALESCE(v.INVIATI, -1) FROM dbo.CLIENTI AS p LEFT JOIN dbo.ORDINI AS pv ON p.CODICI = pv.CODICI LEFT JOIN EVASI AS v ON p.CODICE = v.CODICE WHERE p.CODICE = '1200'

i due nomi prima dell'uguale sono gli alias (è un'altra sintassi rispetto ad AS).
ISNULL richiede due parametri sempre, il primo è il valore che viene testato e il secondo è il valore che deve essere messo se il primo è NULL (fai attenzione, io non sapendo se è stringa o numerico ho messo uno 0, ma devi rispettare il tipo del campo).
COALESCE usata così è pressochè identica ad ISNULL ma la funzione è un po' diversa poichè ha più di due parametri facoltativi e torna il primo dei valori NON NULL dei parametri passati.


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

tigre Profilo | Junior Member

GRAZIE...FUNZIONA BENE

alx_81 Profilo | Guru

>GRAZIE...FUNZIONA BENE
se credi che la risposta ti abbia aiutato, chiudi il thread accettando la risposta.
Grazie
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5