Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   INNER JOIN de tres tablas no muestra datos (https://www.clubdelphi.com/foros/showthread.php?t=76157)

jasmad 12-10-2011 20:57:38

INNER JOIN de tres tablas no muestra datos
 
buenas,
tengo una base de datos con tres tablas de cliente, por que hay dos tipos de clientes y la tabla de cliente que tiene los datos generales de los dos tipos de cliente, entonces para agregar un cliente a la bd necesariamente se llenan la tabla de datos generales y una de las tablas que heredan la general dependiendo del tipo, la cuestion es quiero crear un view que una las tres para obtener todos los clientes, pero cuando lo ejecuto me devuelve valores nulos... este es el query:

Código SQL [-]
SELECT CLIENTE."ID" AS CLIENTE_ID,
           CLIENTE."NOMBRE_CLIENTE" AS CLIENTE_NOMBRE_CLIENTE,      
           CLIENTE."CEDULA" AS CLIENTE_CEDULA,      
           CLIENTE."CIUDAD" AS CLIENTE_CIUDAD,      
           CLIENTE."TELEFONO" AS CLIENTE_TELEFONO,      
           CLIENTE."CELULAR" AS CLIENTE_CELULAR,      
           CLIENTE."FAX" AS CLIENTE_FAX,      
           CLIENTE."EMAIL" AS CLIENTE_EMAIL,      
           CLIENTE."DIRECCION" AS CLIENTE_DIRECCION,      
           CLIENTE."PROVINCIA" AS CLIENTE_PROVINCIA,      
           CLIENTE."PAIS" AS CLIENTE_PAIS,      
           CLIENTE."TIPO" AS CLIENTE_TIPO,      
           CLIENTE."APARTADO_POSTAL" AS CLIENTE_APARTADO_POSTAL,      
           CLIENTE."CODIGO_POSTAL" AS CLIENTE_CODIGO_POSTAL,      
           CLIENTE_DERIVADO_1."ESTADO_CONFIGURACION" AS ESTADO_CONFI,      
           CLIENTE_DERIVADO_1."ESTADO_EQUIPO" AS ESTADO_EQUIP,      
           CLIENTE_DERIVADO_1."NUMERO_TERMINAL" AS NUMERO_TERMI,      
           CLIENTE_DERIVADO_1."NOMBRE_NEGOCIO" AS NOMBRE_NEGOC,      
           CLIENTE_DERIVADO_1."EMPRESA_INSTALO" AS EMPRESA_INST,      
           CLIENTE_DERIVADO_1."AFILIADOR" AS AFILIADOR,      
           CLIENTE_DERIVADO_1."FECHA" AS FECHA,      
           CLIENTE_DERIVADO_1."FECHA_INGRESO" AS FECHA_INGRES,      
           CLIENTE_DERIVADO_1."FECHA_INSTALACION" AS FECHA_INSTAL,      
           CLIENTE_DERIVADO_2."FECHA_NACIMIENTO" AS FECHA_NACIMIEN,      
           CLIENTE_DERIVADO_2."FECHA_VENCIMIENTO" AS FECHA_VENCIMIE,      
           CLIENTE_DERIVADO_2."CONTACTO" AS CONTACTO,      
           CLIENTE_DERIVADO_2."ESTADO_CONTRATO" AS ESTADO_CONTRAT,      
           CLIENTE_DERIVADO_2."SEGUNDO_TELEFONO" AS SEGUNDO_TELEFO,      
           SISTEMA."NOMBRE" AS SISTEMA_NOMBRE,      
           USUARIO."NOMBRE_USUARIO" AS USUARIO_NOMBRE_USUARIO 
FROM "CLIENTE" CLIENTE 
           INNER JOIN "CLIENTE_DERIVADO_1" CLIENTE_DERIVADO_1 ON CLIENTE."ID" = CLIENTE_DERIVADO_1."ID_CLIENTE"      
           INNER JOIN "CLIENTE_DERIVADO_2" CLIENTE_DERIVADO_2 ON CLIENTE."ID" = CLIENTE_DERIVADO_2."ID_CLIENTE"      
           INNER JOIN "SISTEMA" SISTEMA ON CLIENTE_DERIVADO_1."ID_SISTEMA" = SISTEMA."ID"      
           INNER JOIN "USUARIO" USUARIO ON CLIENTE_DERIVADO_1."ID_USUARIO" = USUARIO."ID" ;

ademas hay dos relaciones mas pero estas no afectan ya que he probado el query separando los tipos de cliente y funciona, el problema es cuando uno los dos tipos de cliente...
alguien sabe que tiene de incorrecto este query:confused:

celades1 13-10-2011 08:50:27

Hola

Entiendo que un cliente esta en una tabla tipo o en la otra pero no en las dos
Por tanto debes hacer left join de esas dos tablas no inner

Código SQL [-]
    LEFT JOIN "CLIENTE_DERIVADO_1" CLIENTE_DERIVADO_1 ON CLIENTE."ID" = CLIENTE_DERIVADO_1."ID_CLIENTE"      
           LEFT JOIN "CLIENTE_DERIVADO_2" CLIENTE_DERIVADO_2 ON CLIENTE."ID" = CLIENTE_DERIVADO_2."ID_CLIENTE"

Saludos

jasmad 19-10-2011 18:37:56

gracias celades ese era el problema yo solo conocia el inner, por lo que veo el inner como para unir tablas que se sabe estan relacionadas y el left excluye

celades1 19-10-2011 19:58:45

Hola

el left no excluye sino al contrario

Lo que hace el inner
sobre la primera tabla es no enviar nada que no este en la segunda

lo que hace el left
muestra todos los registros de la primera tabla esten o no ligados a la segunda y si la segunda tiene relacion con el registro de la primera te envia sus datos en caso contrario los valores de la segunda seran nulos

En fin no se explicarme mejor, pero hay muchisima documentación al respecto

Saludos


La franja horaria es GMT +2. Ahora son las 18:18:51.

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