Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-04-2009
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 21
Toni Va por buen camino
Problema con 2 joins mismos campos

Hola,

Tengo un problema con una consulta en la que realizo dos joins, y el problema es que solo me devuelve los registros del segundo join. Y el resultado que busco es que me devuelva todos los registros de la tablaA con los datos que coincidan de las otras tablas.

SELECT "TablaA."."Campo1", "TablaB."."Campo1", "TablaC."."Campo1"
FROM "TablaA"
LEFT OUTER JOIN "TablaB" ON (("TablaA"."idDocumento" = "TablaB"."idDocumento") AND ("TablaA"."Flag" = 'B'))
LEFT OUTER JOIN "TablaC" ON (("TablaA"."idDocumento" = "TablaC"."idDocumento") AND ("TablaA"."Flag" = 'C'))

La consulta funciona bien si solo utilizo uno de los joins, creo que lo que da problemas es que utilizo en la condicion los mismo campos de la TablaA.

Estoy utilizando interbase 6.0 y desde C++ Builder 6.0 con componentes IBX.

Saludos.

Nota: Si en las condiciones de los dos joins quito la comparacion "TablaA"."Flag" = 'C', el resultado que da la consulta es casi el deseado. Por lo menos retorna todos lo registros de la TablaA. Lo unico que confunde los documentos de un tipo y de otro.
__________________
Saludos,

Bitman

Última edición por Toni fecha: 21-04-2009 a las 15:52:57.
Responder Con Cita
  #2  
Antiguo 21-04-2009
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código SQL [-]
SELECT "TablaA."."Campo1", "TablaB."."Campo1", "TablaC."."Campo1"
FROM "TablaA"
LEFT OUTER JOIN "TablaB" ON (("TablaA"."idDocumento" = "TablaB"."idDocumento"))
LEFT OUTER JOIN "TablaC" ON (("TablaA"."idDocumento" = "TablaC"."idDocumento"))
where "TablaA"."Flag" in ('B', 'C')
__________________

Responder Con Cita
  #3  
Antiguo 21-04-2009
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 21
Toni Va por buen camino
Hola ContraVeneno,

Primero muchas gracias por tu contestacion.

Pero quizas no me explique del todo bien, en la TablaA hay muchos registros con valores distintos para el campo Flag ('A','B,'C','D'...) y quiero que en la consulta me los muestre todos.

Pero en el caso de un registro con valor 'B' vaya a buscar solo a la TablaB y si el valor es 'C' a la TablaC, otros valores no los buscara en tablas anexas y mostrara los campos TablaB.Campo1, TablaC.Campo1 como null.

Por eso esta añadido a la condicion del join la comparacion de valor del Flag, que de hecho si solo dejo uno de los join funciona bien, pero claro me hace falta contra las dos tablas y no veo el porque.

Saludos
__________________
Saludos,

Bitman
Responder Con Cita
  #4  
Antiguo 21-04-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si quieres los datos de la TablaA que también tengan datos en las otras dos tablas, deberás utilizar "JOIN" y no "LEFT OUTER JOIN".
También puedes probar utilizando "LEFT JOIN"

Código SQL [-]
SELECT "TablaA."."Campo1", "TablaB."."Campo1", "TablaC."."Campo1"
FROM "TablaA"
JOIN "TablaB" ON (("TablaA"."idDocumento" = "TablaB"."idDocumento") AND ("TablaA"."Flag" = 'B'))
JOIN "TablaC" ON (("TablaA"."idDocumento" = "TablaC"."idDocumento") AND ("TablaA"."Flag" = 'C'))

Código SQL [-]
SELECT "TablaA."."Campo1", "TablaB."."Campo1", "TablaC."."Campo1"
FROM "TablaA"
LEFT JOIN "TablaB" ON (("TablaA"."idDocumento" = "TablaB"."idDocumento") AND ("TablaA"."Flag" = 'B'))
LEFT JOIN "TablaC" ON (("TablaA"."idDocumento" = "TablaC"."idDocumento") AND ("TablaA"."Flag" = 'C'))

Última edición por duilioisola fecha: 21-04-2009 a las 18:51:07.
Responder Con Cita
  #5  
Antiguo 21-04-2009
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
pero lo que se requiere son "Todos" los registros de la TablaA, por lo que el "left outer join" es correcto...
__________________

Responder Con Cita
  #6  
Antiguo 21-04-2009
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 21
Toni Va por buen camino
Hola duilioisola,

Muchas gracias por tu contestacion.

Lo he probado pero no funciona bien, no retorna ningun registro en este caso.

Esto es una cosa que ya he realizado habitualmente y siempre me ha funcionado anexar tablas externas con left outer join. La unica diferencia que hay en este caso y la que me provoca el problema es que las dos tablas se anexan con un mismo campo de la tabla principal y en funcion del valor de un Flag debe anexar con una o con otra y si el flag tienen otro valor diferente mostrar el registro igualmente.

Es curioso porque solo muestra los registros coincidentes con el segundo join!!

Saludos.
__________________
Saludos,

Bitman

Última edición por Toni fecha: 21-04-2009 a las 19:22:49.
Responder Con Cita
  #7  
Antiguo 21-04-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Acabp de hacer esta prueba:

Código:
 Tabla TA
CAMPO1    IDDOCUMENTO    FLAG
1    1    A
2    2    C
3    3    C
1    1    B
2    2    B
Código:
Tabla TB
CAMPO1    IDDOCUMENTO
1    1
2    2
3    3
Código:
Tabla TC
CAMPO1    IDDOCUMENTO
1    1
2    2
Código SQL [-]
SELECT A.CAMPO1,B.CAMPO1,C.CAMPO1
FROM TA A
LEFT OUTER JOIN TB B ON ((A.iddocumento=B.iddocumento) AND (A.flag='B'))
LEFT OUTER JOIN TC C ON ((A.iddocumento=C.iddocumento) AND (A.flag='C'))

Código:
CAMPO1    CAMPO11    CAMPO12
1    null    null
1    1    null
2    null    2
2    2    null
3    null    null
Responder Con Cita
  #8  
Antiguo 21-04-2009
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 21
Toni Va por buen camino
Este problema ya me resultaba algo extraño, pero al decirme que a ti te funciona correctamente he pensado que quizas fuese la version del servidor de base de datos. Yo estoy utilizando Interbase 6.0 en este equipo donde no me funciona, he copiado la base de datos a otro ordenador que tengo instalado Firebird 1.5 y me funciona correctamente la consulta SQL que me daba el problema.

Por lo que parece ser un problema en el Interbase 6.0.

Muchas gracias por vuestra ayuda.
__________________
Saludos,

Bitman
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Eliminar duplicados lista con mismos caracteres Paolo Varios 12 08-09-2008 10:11:24
De los mismos creadores de pico llega ... seoane Internet 36 22-04-2007 01:03:28
Problema con Joins Luis Castillo SQL 9 30-11-2005 04:19:29
Con urgencia necesito ver los mismos registros.. mateamargo Conexión con bases de datos 5 30-10-2005 17:44:54
Metodos que devuelven referencias a sí mismos shaktale OOP 8 07-06-2003 03:04:12


La franja horaria es GMT +2. Ahora son las 08:55:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi