PDA

Ver la Versión Completa : LEFT OUTER JOIN 1 tabla contra 6 mas


jjorell
28-11-2006, 18:39:38
Hola! Espero alguien me puede ayudar a solucionar este problema.

Estoy haciendo un sistema en deplhi contra SQLServer 2005, pero los datos de origen los tomo del DB2. El sistema consiste en calcular la necesidad de Hilo a partir de la cantidad de tela acabada, pero para esto tengo que tener la relacion entre la tela acabada y la tela cruda, luego la tela acabada con el hilo, el problema esque la tela acabada puede relacionarse con varios crudo, es por esto que debo de hacer la siguiente query (la del problema).

SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,
ROUND(SUM(COALESCE(E.DTNTKG,0)),2) CanDisponible,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,0 IdClientes,'Cliente',2006 Ano,2 IdPlanificacion
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,TELACRUDA.MSTROLCR E ,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND A.CODMEZ * = E.DTCMEZ AND A.CODCRU * = E.DTCODI AND C.PGMESH=F.CMEZCL AND ((E.DTSTAT='') OR (E.DTSTAT='P'))
GROUP BY A.CODACA,B.TANOMT,A.CODMEZ,A.CODCRU,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )),
C.TCIDES, C.PGCODH,C.TCTITU,C.PGMESH,ROUND(C.PGPORC,2),C.TCORIG,C.TCDESC,C.TCIDCO,F.NMEZCL

Pero resulta que cuando aun no ha ingresado tela cruda en bodega (tabla TELACRUDA.MSTROLCR E) no esta registrada asi que no me realiza el Join, por esta razon he intendado hacerlo de la siguiente manera:

SELECT Rela.IdProductos,Producto,CodMezcla,IdCrudo,Crudo, ROUND(SUM(COALESCE(Inve.DTNTKG,0)),2) CanDisponible,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,ProveedorHilo,Desc_Producto,TipPr oceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion FROM
(SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,
LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,
C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,
0 IdClientes,'Cliente' Cliente,2006 Ano,2 IdPlanificacion
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND C.PGMESH=F.CMEZCL
GROUP BY A.CODACA,B.TANOMT,A.CODMEZ,A.CODCRU,LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )),
C.TCIDES, C.PGCODH,C.TCTITU,C.PGMESH,ROUND(C.PGPORC,2),C.TCORIG,C.TCDESC,C.TCIDCO,F.NMEZCL) Rela LEFT OUTER JOIN TELACRUDA.MSTROLCR Inve
ON Rela.CodMezcla = Inve.DTCMEZ AND Rela.IdCrudo = Inve.DTCODI WHERE ((Inve .DTSTAT='') OR (Inve .DTSTAT='P'))


Sin ningun resultado positivo...solo el siguiente error:

la columna IDPRODUCTOS o expresion en la sentencia SELECT es invalida.

En SQL Server esto lo hubiese solucionado con *= y ya :D pero DB2 no lo acepta :(

Espero alguien pueda ayudarme o me de alguna idea sobre el mensaje (ya probe quitando ese campo y el error me persiste siempre en el campo que queda primero en la sentencia).

jjorell
28-11-2006, 18:52:23
Hola! ya solucione mi problema... resulta que se me olvido mover el group by afuera de la subconsulta, al final me queda asi :

SELECT IdProductos,Producto,CodMezcla,IdCrudo,Crudo, ROUND(SUM(COALESCE(Inve.DTNTKG,0)),2) CanDisponible,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,ProveedorHilo,Desc_Producto,TipPr oceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion FROM
(SELECT DISTINCT A.CODACA IdProductos,B.TANOMT Producto,A.CODMEZ CodMezcla,A.CODCRU IdCrudo,
LTRIM(RTRIM(LTRIM(RTRIM(C.TCSIGL)) || LTRIM(RTRIM(C.TCNUME)) || ' ' || LTRIM(RTRIM(C.TCDESC)) || ' ' || LTRIM(RTRIM(D.TCDESC)) )) Crudo,C.TCIDES IdEspecialHilo, C.PGCODH IdHilo,C.TCTITU Hilo,
C.PGMESH CodComposicion,ROUND(C.PGPORC,2) Porcentaje,C.TCORIG ProveedorHilo,C.TCDESC Desc_Producto,C.TCIDCO TipProceso,F.NMEZCL Composicion,
0 IdClientes,'Cliente' Cliente,2006 Ano,2 IdPlanificacion
FROM INVENT.REACACRU A,INVENT.MSTELAAC B, TELACRUDA.MSTTCRU C,COLORAN.MSTCRUDO D,COLORAN.MSTMESCL F
WHERE A.CODACA=B.TACODT AND A.CODMEZ=C.TCCMEZ AND A.CODCRU=C.TCCODI AND A.CODACA=11011566
AND A.CODMEZ=D.TCCMEZ AND A.CODCRU=D.TCCODI AND C.PGMESH=F.CMEZCL) Rela LEFT OUTER JOIN TELACRUDA.MSTROLCR Inve
ON Rela.CodMezcla = Inve.DTCMEZ AND Rela.IdCrudo = Inve.DTCODI WHERE ((Inve .DTSTAT='') OR (Inve .DTSTAT='P'))
GROUP BY IdProductos,Producto,CodMezcla,IdCrudo,Crudo,IdEspecialHilo,IdHilo,Hilo,CodComposicion,Porcentaje,Pr oveedorHilo,Desc_Producto,TipProceso,Composicion,IdClientes,Cliente,Ano,IdPlanificacion

Esta si me funciona bien ;)