Problema con INNER JOIN

mercoledì 13 giugno 2007 - 16.47

elsinore Profilo | Junior Member

Ciao a tutti, ho un problema con una query, qualcuno mi spiega prchè questa funziona

SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR '3', WO_STATE.NAME '4', WORK_ORDER.START_DATE '5'
FROM WORK_ORDER
INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND ID_INEQP=-1


e questa no??

SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR '3', WO_STATE.NAME '4' , INST_EQP.CODE '5'
FROM WORK_ORDER
INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL
WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND ID_INEQP=-1

mi da il seguente errore
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'ID_INEQP'.

grazie!

lbenaglia Profilo | Guru

>Ciao a tutti, ho un problema con una query, qualcuno mi spiega
>prchè questa funziona
>
>SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR
>'3', WO_STATE.NAME '4', WORK_ORDER.START_DATE '5'
>FROM WORK_ORDER
>INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
>INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
>WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND ID_INEQP=-1
>
>
>e questa no??
>
>SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR
>'3', WO_STATE.NAME '4' , INST_EQP.CODE '5'
>FROM WORK_ORDER
>INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
>INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
>INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL
>WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND ID_INEQP=-1
>
>mi da il seguente errore
>Server: Msg 209, Level 16, State 1, Line 1
>Ambiguous column name 'ID_INEQP'.

Perché a quanto pare la tabella INST_EQP ed un'altra tra WORK_ORDER, FL e WO_STATE hanno una colonna chiamata 'ID_INEQP'; dato che nella clausola WHERE hai specificato la condizione ID_INEQP=-1, SQL Server si arrabbia perché non sa a quale tabella si riferisce.

Il problema lo risolvi specificando in modo esplicito la tabella di riferimento.

>grazie!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

elsinore Profilo | Junior Member

a ok....
l'ho modificato così

SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR '3', WO_STATE.NAME '4' , INST_EQP.CODE '5'
FROM WORK_ORDER
INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL
WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND WORK_ORDER.ID_INEQP=-1

solo chem i apsettavo gli stessi dati di prima più la colonna 5, valorizzata....e invece non mi appare nulla....uf

questo inner join
INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL

mi esclude gli altri? non dovrebbe solo aggiungere?

lbenaglia Profilo | Guru

>solo chem i apsettavo gli stessi dati di prima più la colonna
>5, valorizzata....e invece non mi appare nulla....uf
>
>questo inner join
>INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL
>
>mi esclude gli altri? non dovrebbe solo aggiungere?

Eh no, al max ti restituisce le stesse righe di prima altrimenti "filtra" nel caso in cui la tabella INST_EQP non soddisfi la condizione WORK_ORDER.ID_FL = INST_EQP.ID_FL

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

elsinore Profilo | Junior Member

e no appunto... così facendo

SELECT WORK_ORDER.ID_WO '1', WORK_ORDER.START_DATE '2', WORK_ORDER.SHORT_DESCR '3', WO_STATE.NAME '4' , INST_EQP.CODE '5'
FROM WORK_ORDER
INNER JOIN FL ON WORK_ORDER.ID_FL = FL.ID_FL
INNER JOIN WO_STATE ON WORK_ORDER.ID_WO_STATE = WO_STATE.ID_WO_STATE
INNER JOIN INST_EQP ON WORK_ORDER.ID_FL = INST_EQP.ID_FL
WHERE (FL.CODE_PREFIX LIKE 'ICT_IT/PDR/FCSITE/FC01A') AND WORK_ORDER.ID_INEQP=-1


non mi restituisce nessuna riga...mentre pensavo mi restituisse come minimo quella di prima....in più in l'utlima colonna popolata se
WORK_ORDER.ID_FL = INST_EQP.ID_FL


dove sbaglio???

lbenaglia Profilo | Guru

>e no appunto...
Come eh no appunto?
Ti ho spiegato sopra il motivo per il quale ottieni meno righe.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

elsinore Profilo | Junior Member

scusa....non avevo letto bene!

cmq non ho capito!

a me serve solo aggiungere al tutto, una colonna, in cui visualizzo INST_EQP.CODE dove WORK_ORDER.ID_FL = INST_EQP.ID_FL .... come dovrei scrivere la query?

lbenaglia Profilo | Guru

>a me serve solo aggiungere al tutto, una colonna, in cui visualizzo
>INST_EQP.CODE dove WORK_ORDER.ID_FL = INST_EQP.ID_FL .... come
>dovrei scrivere la query?

La query è sintatticamente corretta, ma eseguendo una INNER JOIN con INST_EQP verranno restituite solo le righe che soddisfano la condizione WORK_ORDER.ID_FL = INST_EQP.ID_FL, filtrando quelle che non la soddisfano.
Se tu vuoi restituire tutte le righe dalla precedente JOIN anche nel caso in cui la condizione WORK_ORDER.ID_FL = INST_EQP.ID_FL non venga soddisfatta, devi ricorrere ad una LEFT OUTER JOIN: in questo caso la colonna INST_EQP.CODE sarà valorizzata a NULL.

Riscriviamo in modo un po' più ordinato il tutto:

SELECT WO.ID_WO AS '1' , WO.START_DATE AS '2' , WO.SHORT_DESCR AS '3' , WO.NAME AS '4' , IE.CODE AS '5' FROM WORK_ORDER AS WO INNER JOIN FL ON WO.ID_FL = FL.ID_FL INNER JOIN WO_STATE AS WS ON WO.ID_WO_STATE = WS.ID_WO_STATE LEFT JOIN INST_EQP AS IE ON WO.ID_FL = IE.ID_FL WHERE FL.CODE_PREFIX = 'ICT_IT/PDR/FCSITE/FC01A' AND WO.ID_INEQP = -1;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

elsinore Profilo | Junior Member

grazie mille!!!!!!! era quello che volevo ottenere!!! quindi dovevo usare il LEFT JOIN!....ottimo!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5