Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

¿Left join o Right join?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿Left join o Right join? Responder citando

Tengo que montar una select con más de dos tablas de una base de datos Firebird y me está apareciendo un problema. Si ejecuto este query:
Código:
SELECT A.Apellidos, A.Nombre, A.Domicilio, A.Cpostal, B.Poblacion, COUNT(C.C_refer) Recibos, SUM(C.Importe) Importe
FROM Personas A, Poblaciones B, Recibos C
WHERE A.Municipio = B.Municipio AND A.Municipio = 1523 AND A.C_refer = C.C_refer AND C.Situacion = 'D'
GROUP BY Apellidos, Nombre, Domicilio, Cpostal, Poblacion
ORDER BY Apellidos, Nombre

y hay filas de la tabla Personas que no tienen equivalente en la de Recibos, bien porque no hay grabada ninguna ficha o las que lo están no tienen la situación indicada, no me aparecen y me hace falta que aparezcan todas las fichas del Municipio 1523. Había pensado en usar LEFT JOIN o RIGHT JOIN, pero todos los ejemplos que he visto por la web son con dos tablas, del tipo:
Código:
SELECT A.Apellidos, A.Nombre, A.Domicilio, A.Cpostal, COUNT(C.C_refer) Recibos, SUM(C.Importe) Importe
FROM Personas A LEFT JOIN Recibos C ON A.C_refer = C.C_refer
WHERE A.Municipio = 1523 AND C.Situacion = 'D'
GROUP BY Apellidos, Nombre, Domicilio, Cpostal
ORDER BY Apellidos, Nombre

Pero no he encontrado como hacer esto mismo cuando hay más de dos tablas. ¿Se puede hacer lo que sugiero? ¿Cómo? En caso contrario, ¿qué alternativa tendría?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola angel, esto lo tengo funcionando en firebird 2.1.
Código:
/* View: CAR_V_MODELOS */
drop view CAR_V_MODELOS;
CREATE VIEW CAR_V_MODELOS(
   ID,
   MODELO,
   MARCA,
   ORIGEN,
   TIPO,
   SEGMENTO,
   SEGEXTRA,
   SEGINDUSTRIA,
   COMBUSTIBLE,
   ALIMENTACION,
   TRACCION,
   EQUIPAMENTO,
   PRECIO_OKM,
   YEAR_STARFA,
   YEAR_STOPFA,
   STOCK,
   N_NEG,
   N_BUS,
   HABILITADO) AS
   SELECT  CAR_MODELOS.ID,
         CAR_MODELOS.MODELO,
         CAR_MARCAS.MARCA,
         CAR_MARCAS.ORIGEN,
         CAR_TIPOS.TIPO,
         CAR_SEGMENTOS.SEGMENTO,
         CAR_SEGEXTRAS.SEGEXTRA,
         CAR_SEGINDUSTRIA.SEGINDUSTRIA,
         CAR_MODELOS.REF_COMBUSTI,
         CAR_MODELOS.REF_ALIMENTA,
         CAR_TRACCION.TRACCION,
         CAR_EQUIPAMENTOS.EQUIPAMENTO,
         CAR_MODELOS.PRECIO_OKM,
         CAR_MODELOS.YEAR_STARFA,
         CAR_MODELOS.YEAR_STOPFA,
         CAR_MODELOS.STOCK,
         CAR_MODELOS.N_NEGO,
         CAR_MODELOS.N_BUSCADO,
         CAR_MODELOS.HABILITADO
      FROM CAR_MODELOS
         LEFT JOIN CAR_MARCAS ON CAR_MODELOS.REF_MARCA=CAR_MARCAS.ID
         LEFT JOIN CAR_TIPOS ON CAR_MODELOS.REF_TIPO=CAR_TIPOS.ID
         LEFT JOIN CAR_SEGMENTOS ON CAR_MODELOS.REF_SEGMENTO=CAR_SEGMENTOS.ID
         LEFT JOIN CAR_SEGEXTRAS ON CAR_MODELOS.REF_SEGEXTRA=CAR_SEGEXTRAS.ID
         LEFT JOIN CAR_SEGINDUSTRIA ON CAR_MODELOS.REF_SEGINDUS=CAR_SEGINDUSTRIA.ID
         LEFT JOIN CAR_TRACCION ON CAR_MODELOS.REF_TRACCION=CAR_TRACCION.ID
         LEFT JOIN CAR_EQUIPAMENTOS ON CAR_MODELOS.REF_EQ=CAR_EQUIPAMENTOS.ID;

y así puedes continuar hasta el infinito jejeje si las cosas fueran asi.
No hasta el infinito no, solo bromeaba, en mysql5 creo que son 64 JOIN no recuerdo donde lo leí, para firebird no encontré información técnica de ese detalle.

De todas formas la consulta anterior funciona correctamente, se pueden realizar otras combinaciones dentro del LEFT JOIN por ej:
Código:
LEFT JOIN CAR_EQUIPAMENTOS ON CAR_MODELOS.REF_EQ=CAR_EQUIPAMENTOS.ID AND CAR_EQUIPAMENTOS.HABILITADO='Y';
por dar un ejemplo, claro que esto es valido para los otros tipos de encuentros.

Si prestas atención en a la consulta, veras que puede ser potencial mente peligrosa ya que no incluyo ninguna condición para restringir el conjunto de datos y si la respuesta son 100.000 registros? , debes tener cuidado ya que se puede volver un poco pesada la consulta, a ese VIEW luego lo trato algo así
Código:
SELECT campo1,campo2,.... FROM CAR_V_MODELOS WHERE campo1:=parm1 and campo2:=parm2;
te menciono esto porque puede servirte, ya que es una forma de agilizar las cosas.
saludos tor.
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la ayuda Tor. Echaré una ojeada al código y ya os diré como me ha ido.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.