Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/10/2007, 18:38
Avatar de Gabo77
Gabo77
 
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: No se como hacer esta consulta....

Si los campos de autores solo son 3 la cosa está fácil.


Código:
Select A.Id, A.Nombre, B.Autor As Autor1, C.Autor As Autor2, D.Autor As Autor3
From Nombres A
Inner Join Autores B
    On A.Autor1 = B.Id
Inner join Autores C
    On A.Autor2 = C.Id
Inner Join Autores D
    On A.Autor3 = D.Id
Where A.Id = 3
Sin embargo, esta consulta te obliga a que tengas siempre los 3 autores especificados. Suponiendo que este no siempre es tu caso, y que necesites mostrar los nombres incluso los que tienen menos de 3 autores (incluso ninguno) la siguiente consulta te ayudará.

Código:
Select A.Id, A.Nombre,
    IsNull(B.Autor, 'Sin Autor 1') As Autor1,
    IsNull(C.Autor, 'Sin Autor 2') As Autor2,
    IsNull(D.Autor, 'Sin Autor 3') As Autor3
From Nombres A
Left Join Autores B
    On A.Autor1 = B.Id
Left join Autores C
    On A.Autor2 = C.Id
Left Join Autores D
    On A.Autor3 = D.Id
Where A.Id = 3
Al cambiar la sentencia Inner por el Left, le pedimos al motor de BD que nos traiga los resultados de la tabla nombres, aun cuando no encuentre coincidencias con los registros de la tabla autores. Además le estamos agregando la funcion IsNull (que reempleaza los valores nulos por lo que le indiques en el segundo parámetro) debido a que si no encuentra una relación te devolverá ese campo en Nulo, cosa que no es muy bonita que digamos.

Si observas bien, puedes jugar con los INNER y los LEFT, haciendo que un autor en especifico sea o no obligatorio para el reporte que desees mostrar, es decir, puedes optar por cambiar solo un INNER por un LEFT, y la consulta trabajará de lo lindo....


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....