Ver Mensaje Individual
  #1  
Antiguo 16-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Reputación: 21
Cabanyaler Va por buen camino
Unhappy Duplicados con LEFT OUTER JOIN

Hola compañeros.

Quisiera consultar el siguiente tema.

Asunto:
Tuplas duplicadas en consulta de varias tablas unidas por left outer join.

Problema:
Cuando realizo esta consulta, se obtienen tuplas de la tabla principal CONTRATOS duplicadas. Además he observado que se producen según el número de tuplas de las tablas esclavas que se encuentran y cumplen su WHERE. Así pues, si existe CONTRATO que cumple la WHERE, se retorna una tupla, pero si además para ese mismo CONTRATO su cliente asociado también cumple su propia clausula WHERE se retorna otra tupla, idéntica a la anterior, y si además el COMERCIAL también cumple la WHERE se obtiene otra tupla igual, de ese modo obtengo tres tuplas del mismo CONTRATO iguales en la misma consulta.

Soluciones estudiadas:
He buscado como eliminar una vez realizada la consulta incluyendo duplicados, dichas tuplas duplicadas, ya que en la consulta incluyo la clave principal de los CONTRATOS, pero no puedo realizar esta limpieza de ese modo ya que no quiero eliminar nada en el servidor, simplemente los duplicados en la consulta en el lado cliente y si ejecuto un p.e. ConsultaConDuplicados.delete y posteriormente por cuestiones de operatividad del programa se realiza un ConsultaConDuplicados.UpdateBatch quizá elimine algo por algún efecto lateral.

Tampoco puedo incluir un SELECT DISTINCT ya que hago búsqueda por un campo Memo y con este tipo de campos no se puede incluir dicha clausula.

Incluyo código (abreviado) de la consulta por si tengo algún fallo en su propio diseño.

Muchas gracias por vuestro tiempo y conocimiento. Un saludo.

Código SQL [-]

/* Retorna tots els Contratos que pasen els filtres establist amb les diferents clausules del WHERE
   Amb Rel.lació amb  
             CLIENTES y COMERCIALES
   amb telèfon o sense'll */
       
CREATE PROCEDURE ADOQ_Contratos_Clientes_Comerciales

/* Parametres del Contrato */
@NumCon_sp varchar(7), ....AS

SELECT 
   Contratos.*
FROM
   Contratos

   /* Unisc per C.Aj amb Clientes i estos amb TelefonosCli*/
   LEFT OUTER JOIN
   Clientes LEFT OUTER JOIN TelefonosCli     
                         ON TelefonosCli.CodCli_TelCli = Clientes.CodAut_Cli
   ON Clientes.CodAut_Cli = Contratos.CodCli_Con

   /* Unisc amb Comerciales */
   LEFT OUTER JOIN Comerciales
      ON Comerciales.CodAut_Com = Contratos.CodCom_Con      

WHERE  
( 
   (   (Contratos.NumCon_Con LIKE '%' + @NumCon_sp + '%' )
   AND (Contratos.FecCon_Con >= @FecIniCon_sp  AND Contratos.FecCon_Con <= @FecFinCon_sp)
   AND ((Contratos.ObsCon_Con  LIKE '%' + @ObsCon_sp + '%') OR (Contratos.ObsCon_Con IS NULL))
   )
 AND
    (    ((Clientes.TipVia_Cli  LIKE '%' + @TipVia_sp + '%')
      AND (Clientes.DirCli_Cli  LIKE '%' + @DirCli_sp + '%') 
      AND ((TelefonosCli.NumTel_telCli LIKE '%' + @NumTel_sp + '%') OR(TelefonosCli.NumTel_telCli IS NULL))
    )
 AND
    (Comerciales.NomCom_Com LIKE '%' + @NomCom_sp + '%')
)

ORDER BY Contratos.TipCon_Con
GO


__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.

Última edición por Cabanyaler fecha: 16-11-2005 a las 09:14:18.
Responder Con Cita