TSQL 2014 - COSA C'E' DI SBAGLIATO ?

mercoledì 12 dicembre 2018 - 11.45
Tag Elenco Tags  Windows Server 2008 R2  |  SQL Server Express

Dony Profilo | Newbie

Ciao a tutti,
sono anni che lavoro molto su MySQL ma ora mi trovo a dover creary delle Query su T-SQL 2014.
sicuramente mi manca qualche conoscenza di quest'ultimo, ma proprio non riesco a capire perchè nella riga LEFT JOIN dbo.ARTI_LISTINI l .. e solo in questa, a.CKY_ART da errore dicendo impossibile referenziare l'identificatore in più parti (riferito ad a a.CKY_ART), anche se lo identifico con il nome completo invece che con l'alias da lo stesso errore e non capisco cosa significa, di seguito la semplice query che genera l'errore

SELECT a.CKY_ART, c.CKY_CNT, p.NGB_LIS, l.CKY_ART , l.NPZ_LIS , p.NGB_CAT_CF_SCO
FROM dbo.ARTI a, dbo.RUDT c
LEFT JOIN dbo.PICO p on p.CKY_CNT=c.CKY_CNT
LEFT JOIN dbo.ARTI_LISTINI l on l.PRG_LISTINI =p.NGB_LIS AND l.CKY_ART= a.CKY_ART
WHERE a.CKY_ART='00' AND l.CKY_ART='00' AND c.CKY_CNT='501.00011'

ho guardato la guida di MS ( https://docs.microsoft.com/it-it/sql/relational-databases/errors-events/mssqlserver-4104-database-engine-error?view=sql-server-2017) ma non ho comunque risolto, anche perchè nella mia query è tutto referenziato e poi mi chiedo perchè solo in quella specifica riga non funziona ? nella SELECT c'è e non da problemi, nella clausola WHERE c'è e non da problemi, quindi ?

Grazie a chi mi può far capire, al momento io risolvo indicando nella clausola WHERE, sia a.CKY_ART='00' che l.CKY_ART='00', ma non mi sembra affatto una bella soluzione, in MySQL non mi è mai successo un problema del genere e neppure su oracle.

Saluti a tutti

AGGIORNO :
ho trovato la soluzione :) , semplicemente togliendo l'allias a dbo.ARTI funziona, ma sarei grato se qualcuno sapesse spiegarmi il perchè. Di seguito la query completa e funzionante, l'unico problema non risulto era l'uso dell'alias per dbo.ARTI
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT c.CKY_CNT AS MASTRO_CONTO, cast(SUBSTRING(c.CKY_CNT, 5, 5) AS INT) AS CODICE_CLIENTE, c.CDS_CNT_RAGSOC, dbo.ARTI.CKY_ART AS CODICE_ARTICOLO,dbo.ARTI.CDS_ART,
p.NGB_LIS AS TAB_LISTINO, l.NPZ_LIS as PREZZO_LISTINO , p.NGB_CAT_CF_SCO, vs.CKY_CATART AS CATEG_ART, l.NPZ_LIS as PREZZO_LISTINO, pz.NMP_PRZ_FIN_1 as PREZZO_CLIENTE,
vs.CSG_SCO_UNO AS SCONTO, IIF(pz.NMP_PRZ_FIN_1 IS NULL, (l.NPZ_LIS-(l.NPZ_LIS/100*vs.CSG_SCO_UNO)), pz.NMP_PRZ_FIN_1) AS PREZZO_FINALE
FROM dbo.ARTI
LEFT JOIN dbo.RUDT c ON c.CKY_CNT ='501.00011'
LEFT JOIN dbo.PICO p on p.CKY_CNT=c.CKY_CNT
LEFT JOIn dbo.ARTI_LISTINI l on l.PRG_LISTINI =p.NGB_LIS AND l.CKY_ART=dbo.ARTI.CKY_ART
LEFT JOIN dbo.AMAG_SCO_CLI vs on vs.NKY_CAT_CF_SCO=p.NGB_CAT_CF_SCO AND vs.CKY_CATART=ARTI.NGB_CAT_ART_SCO
LEFT JOIN dbo.PREZ pz on pz.CKY_ART= dbo.ARTI.CKY_ART AND pz.IST_TIPO_PREZ='P' AND pz.CKY_CNT_CLI=c.CKY_CNT
WHERE dbo.ARTI.CKY_ART='00' or dbo.ARTI.CKY_ART='13'
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

iif Profilo | Expert

Prova a mettere AS davanti all'alias

Dony Profilo | Newbie

Grazie, funziona mettendo AS a (dove a è alias).
pensa che ho quasi sempre usato AS anche in MysQL ma funziona ugualmente.
Non capisco però perchè solo in quel punto senza specificare AS a non funziona mentre in tutte le altre parti si ed inoltre tutti gli altri alias si.
riprenderò ad usare sempre AS d'ora in poi

la query finale con AS :

SELECT c.CKY_CNT AS MASTRO_CONTO, cast(SUBSTRING(c.CKY_CNT, 5, 5) AS INT) AS CODICE_CLIENTE, c.CDS_CNT_RAGSOC, a.CKY_ART AS CODICE_ARTICOLO,a.CDS_ART,
p.NGB_LIS AS TAB_LISTINO, l.NPZ_LIS as PREZZO_LISTINO , p.NGB_CAT_CF_SCO, vs.CKY_CATART AS CATEG_ART, l.NPZ_LIS as PREZZO_LISTINO, pz.NMP_PRZ_FIN_1 as PREZZO_CLIENTE,
vs.CSG_SCO_UNO AS SCONTO, IIF(pz.NMP_PRZ_FIN_1 IS NULL, (l.NPZ_LIS-(l.NPZ_LIS/100*vs.CSG_SCO_UNO)), pz.NMP_PRZ_FIN_1) AS PREZZO_FINALE
FROM dbo.ARTI as a
LEFT JOIN dbo.RUDT c ON c.CKY_CNT ='501.00011'
LEFT JOIN dbo.PICO p on p.CKY_CNT=c.CKY_CNT
LEFT JOIn dbo.ARTI_LISTINI l on l.PRG_LISTINI =p.NGB_LIS AND l.CKY_ART=a.CKY_ART
LEFT JOIN dbo.AMAG_SCO_CLI vs on vs.NKY_CAT_CF_SCO=p.NGB_CAT_CF_SCO AND vs.CKY_CATART=a.NGB_CAT_ART_SCO
LEFT JOIN dbo.PREZ pz on pz.CKY_ART= a.CKY_ART AND pz.IST_TIPO_PREZ='P' AND pz.CKY_CNT_CLI=c.CKY_CNT
WHERE a.CKY_ART='00' or a.CKY_ART='13'

GRAZIE ANCORA

iif Profilo | Expert

Figurati
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-2019
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5