Aiuto per Query su DB2

giovedì 17 dicembre 2009 - 19.33

petitmax Profilo | Newbie

Salve,

vi spiego il problema.
Ho queste due tabelle:

TAB1 -> anagrafica fornitori
---------------------------------
FORN1
FORN2
FORN3
FORN4
- - -
FORNn


TAB2 -> una serie di movimenti di magazzino
------------------------------------------------------
FORN2 10000 120000 15000
FORN3 20000 3000 80000
FORN7 10500 6500 9000

Ho bisogno di una query che mi restituisca questo risultato:

TAB_RIS -> risultato query
-------------------------------
FORN1 0 0 0
FORN2 10000 120000 15000
FORN3 20000 3000 80000
FORN4 0 0 0
FORN5 0 0 0
FORN6 0 0 0
FORN7 10500 6500 9000

In pratica mi serve visualizzare i movimenti di magazzino per ciascun fornitore presente nella tabella anagrafica forntore (TAB1) visualizzando comunque la riga del fornitore con tutti "0" quando questo non è presente nella tabella dei movimenti (TAB2).
Spero di essermi spiegato bene.

Per motivi di tempo ho momentaneamente "aggirato" l'ostacolo con un programmino in VB.NET. Sono sicuro che potevo risolvere con una query, ma il poco tempo a mia disposizione mi ha visto costretto a percorrere altre vie.

Mi dite come avrei dovuto strutturare questa query ?

Il Db in questione è un DB2 su As400.

Grazie
Max

alx_81 Profilo | Guru

>Salve,
Ciao

>Per motivi di tempo ho momentaneamente "aggirato" l'ostacolo
>con un programmino in VB.NET. Sono sicuro che potevo risolvere
>con una query, ma il poco tempo a mia disposizione mi ha visto
>costretto a percorrere altre vie.
>Mi dite come avrei dovuto strutturare questa query ?
Questo è il classico scenario da LEFT JOIN:
SELECT T1.Fornitore , COALESCE(T2.valore1, 0) AS Valore1 , COALESCE(T2.valore2, 0) AS Valore2 , COALESCE(T2.valore3, 0) AS Valore3 FROM Tabella1 AS T1 LEFT OUTER JOIN Tabella2 AS T2 ON T2.Fornitore = T1.Fornitore
Con questo codice tu vedrai tutti i record di Tabella1 indipendentemente dal fatto che esista un match col campo fornitore. Siccome dove non si verifica la condizione di join otterrai per i campi di T2 dei valori NULL, la funzione COALESCE ti consente di mettere al suo posto il valore 0, indicato come secondo parametro (potrebbe essere un altro valore o addirittura una serie di altri parametri). La refenrece è qui: http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db2.doc.sqlref/fcoal.htm

>Grazie
di nulla!

--

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

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

petitmax Profilo | Newbie

>Questo è il classico scenario da LEFT JOIN:
>
>SELECT
> T1.Fornitore
> , COALESCE(T2.valore1, 0) AS Valore1
> , COALESCE(T2.valore2, 0) AS Valore2
> , COALESCE(T2.valore3, 0) AS Valore3
>FROM
> Tabella1 AS T1
>LEFT OUTER JOIN Tabella2 AS T2 ON T2.Fornitore = T1.Fornitore
>

Ciao e grazie per la risposta sei stato squisito, la proverò domani stesso in ufficio.
Permettimi una domanda: avevo intuito una cosa del genere e, non essendo completamente a digiuno di SQL, ho provato con una Left Join (tu invece mi suggerisci una Left OUTER Join) la quale però non mi restituiva gli "0" perché vengono restituiti dalla funzione COALESCE ma nemmeon i Null, perché ? Fore è dovuto al fatto che mettervo in Join tab1 con tab2 e non tab2 con tab1 ? è forse, quindi, un problema di ordine nell'indicare le tabelle ?

Grazie ancora
Max

alx_81 Profilo | Guru

>Permettimi una domanda: avevo intuito una cosa del genere e,
>non essendo completamente a digiuno di SQL, ho provato con una
>Left Join (tu invece mi suggerisci una Left OUTER Join) la quale
>però non mi restituiva gli "0" perché vengono restituiti dalla
>funzione COALESCE ma nemmeon i Null, perché ? Fore è dovuto al
>fatto che mettervo in Join tab1 con tab2 e non tab2 con tab1
>? è forse, quindi, un problema di ordine nell'indicare le tabelle?
Il fatto che sia LEFT o LEFT OUTER è solo un problema di sintassi ma significano la stessa cosa.
Di solito quando una LEFT JOIN non ti torna i "null" sperati è perchè c'è una WHERE successiva che li esclude.
Io controllerei lì.
--

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

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5