così senza conoscere il db e con quella sequela di left join non è facile
comunque ad occhio scriverei così
codice:
SELECT opdn.DocEntry, opdn.DocNum, opdn.GroupNum, opdn.CardName, opdn.CardCode, opdn.U_CODMAGA,
opdn.U_CODSPED,opdn.U_CELLA, opdn.U_DTFRANCH,
pdn1.WhsCode, pdn1.BaseRef, pdn1.LineNum, pdn1.ItemCode, pdn1.Quantity, pdn1.TrnsCode,
oitm.ItemName,
octg.PymntGroup, octg.GroupNum,
[@magazzini].code, [@magazzini].[Name],
oshp.TrnspCode, oshp.TrnspName,
owhs.WhsCode, owhs.WhsName,
ocrd.CardCode, ocrd.CardName
FROM
opdn LEFT JOIN pdn1 ON (opdn.DocEntry = pdn1.DocEntry)
LEFT JOIN [@magazzini] ON (opdn.U_CODMAGA = [@magazzini].Code)
LEFT JOIN ocrd ON (opdn.CardCode = ocrd.CardCode)
LEFT JOIN octg ON (opdn.GroupNum = octg.GroupNum)
pdn1 LEFT JOIN oitm AS prodotto ON (pdn1.ItemCode = oitm.ItemCode)
LEFT JOIN oshp ON (pdn1.TrnsCode = oshp.TrnspCode)
LEFT JOIN owhs ON (pdn1.WhsCode = owhs.WhsCode)
LEFT JOIN opdn_clone ON (pdn1.DocEntry = opdn_clone.DocEntry and pdn1.LineNum = opdn_clone.LineNum and (opdn_clone.forzatura <> 'S' or opdn_clone.forzatura = NULL))
WHERE opdn.U_CODSPED = '0001'
order by opdn.U_DTFRANCH
ho tolto le parentesi inutili
la condizione nella where che riguarda una tabella nel ramo povero di un join
(nel caso della Left join la seconda) rende inutile la join
quindi la condizione
codice:
and (opdn_clone.forzatura <> 'S' or opdn_clone.forzatura = NULL)
la ho messa nella clausola di join
ho anche visto che mettevi in join due volte la tabella
opdn_clone con due condizioni diverse sempre con la tabella pdn1 lo ho interpretato come errore e ho messo le due condizioni nella stessa join
s einvece dovevi realmente joinarla due volte allora dovevi usare un alias tipo
codice:
.
.
LEFT JOIN opdn_clone ON (pdn1.DocEntry = opdn_clone.DocEntry and (opdn_clone.forzatura <> 'S' or opdn_clone.forzatura = NULL))
LEFT JOIN opdn_clone as opdn_clone_Bus ON ( pdn1.LineNum = opdn_clone_Bus.LineNum and (opdn_clone_Bus.forzatura <> 'S' or opdn_clone_Bus.forzatura = NULL))
.
.