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 05-07-2011
aleja aleja is offline
Miembro
 
Registrado: oct 2005
Ubicación: Salta - Argentina
Posts: 48
Poder: 0
aleja Va por buen camino
Red face Consulta relacionando 5 tablas...

Hola, tengo que hacer la siguiente consulta y la verdad ya me di por vencida, hace dos dias q vengo intentando y no le encuentro la forma. Tengo una base de datos para una biblioteca, y las siguientes tablas
Informes: id_informe, titulo, anio, id_tema, id_zona, etc...
Temas: id_tema, tema
Zonas: id_zona, zonas
luego cada informe puede tener mas de un autor
Autores: id_autor, apellido, nombre, institucion
Autoresxinformes: id_informe, idautor

En el formulario de busqueda, ingresan el apellio del autor, un tema determinado, una zona y un anio (asi lo quiere mi jefe).

Intente con esta consulta, la verdad agradeceria mucho su ayuda, porq nose como hacerla:
Código SQL [-]
SELECT 
  informes.*,
  temainforme.*,
  zonainf.*,
  autoresxinforme.*
FROM
  informes
  INNER JOIN temainforme ON (informes.idtema = temainforme.idtema)
  INNER JOIN zonainf ON (informes.idzona = zonainf.idzona)
  INNER JOIN autoresxinforme ON (informes.idinforme = autoresxinforme.idinforme)
WHERE
   anio = 'anio que se ingreso'
   temainforme.idtemainf = 'lo que se ingreso'
   zonainf.idzonainf = 'lo que se ingreso'
   autoresxinforme.idinforme = (SELECT autoresxinforme.idinforme FROM autoresxinforme 
   where autoresxinforme.idautor = autor.idautor)
el tema y la zona estan en un dbloockupcombo el año y el apellido del autor se ingresa a mano (el apellido del autor tambien lo podria poner en un dblookupcombo).

Desde ya muchas gracias.

ALE

Última edición por ecfisa fecha: 05-07-2011 a las 02:39:52. Razón: ETIQUETAS [SQL] [/SQL]
Responder Con Cita
  #2  
Antiguo 05-07-2011
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 I.*, T.*, Z.*, AI.* 
FROM informes I  
left outer join temainforme ON (informes.idtema = temainforme.idtema and T.idtemainf like '%lo que se ingreso%') 
left outer join zonainf ON (informes.idzona = zonainf.idzona and zonainf.idzonainf like '%lo que se ingreso%') 
left outer join autoresxinforme ON (informes.idinforme = autoresxinforme.idinforme) 
WHERE I.anio = 'anio que se ingreso'

Cita:
autoresxinforme.idinforme = (SELECT autoresxinforme.idinforme FROM autoresxinforme where autoresxinforme.idautor = autor.idautor)
Esto no tengo la más mínima idea de para que te serviría, no se que haga o para que sirva si el enlace de esta tabla ya lo estas haciendo arriba con el join.

Lo otro que no me gusta es poner * para traerte todos los campos, es mucho mejor que pongas los nombres de los campos y traer solamente los que necesites.

Ahora bien, esa consulta le está dando prioridad a los informes y al ser con "inner join" todos los datos deben coincidir en todas las tablas. Aquí es donde creo yo que no esta funcionando. intenta cambiar el inner join por un "left outer join" y explica un poco más sobre a que dato le vas a dar más prioridad. ¿a los autores o a los informes?
__________________

Responder Con Cita
  #3  
Antiguo 06-07-2011
aleja aleja is offline
Miembro
 
Registrado: oct 2005
Ubicación: Salta - Argentina
Posts: 48
Poder: 0
aleja Va por buen camino
Wink

Hola Contra Veneno, funciono! muchisimas gracias!
en el zquery de delphi quedo asi:
SELECT
informes.*,
temainforme.*,
zonainf.*,
autoresxinforme.*
FROM
informes
LEFT OUTER JOIN temainforme ON (informes.idtema = temainforme.idtemainf)
AND (temainforme.idtemainf like concat('%',:idtema,'%'))
LEFT OUTER JOIN zonainf ON (informes.idzonainf = zonainf.idzonainf)
AND (zonainf.idzonainf like concat('%',:idzona,'%'))
LEFT OUTER JOIN autoresxinforme ON (informes.idinforme = autoresxinforme.idinforme)
AND (autoresxinforme.idautorext like concat('%',:idautor,'%'))
WHERE
informes.anioinforme like concat('%', :anio,'%')

al activar el formulario pongo los valores en cadena vacia asi me muestra todos los informes.

Le doy prioridad a los informes, el usuario ingresa para buscar un informe determinado, ya sea por autor o por tema o por zona o por año o por cualquiera de esas conbinaciones. El ultimo select lo habia puesto porq el id de autor lo saco de la tabla autores y con ese id voy a la tabla autores por informes, ya que el usuario ingresa un apellido.

Muchas Gracias!!! no sabes como me has ayudado!
ALE
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
Consulta Tablas - DB othaheguy Varios 16 13-04-2010 13:25:31
error relacionando de TADOQuerys zajoma SQL 1 27-12-2006 21:37:02
Usar DELETE relacionando 2 tablas Rakelina SQL 5 22-05-2004 16:01:57
Consulta SQL con 4 tablas nefy SQL 2 03-05-2004 23:25:22
Informe relacionando dos tablas mediante MasterFields heavy_horse Impresión 3 16-08-2003 03:42:20


La franja horaria es GMT +2. Ahora son las 16:39:09.


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