 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 18 May, 2009 11:50 am Asunto: ¿Left join o Right join? |
|
|
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 |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Jue 21 May, 2009 10:16 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|