SQL - SELECT a una tabla con dos llaves foraneas

   
Vista:

SELECT a una tabla con dos llaves foraneas

Publicado por David (6 intervenciones) el 09/06/2009 04:55:37
Hola, en este momento estoy desarrollando un sistema que controla las llegadas y salidas de autobuses, y me he topado con este problema, necesito saber como realizar un select a varias tablas, y en dos de ellas se comparten dos llaves foraneas. Aqui pondre como esta la estructura para explicarme mejor:
--------------------- ------------------
Autobus | | Operador
--------------------- ------------------
IdAutobus |* | - *| IdOperador
Marca | | | Nombre
Modelo | |
IdOperador1 | ---------- |
IdOperador2 | ---------- |

Hay dos operadores en la tabla autobus porque dependiendo del viaje, pueden tener 1 si es corto, o 2 si es largo (mas de 1 dia de viaje). El select quiero que me regrese los nombres de los operadores que estan en el autobus, no los Id`s, el resultado debiera quedar asi:

TABLA
-----------------------------------------------------------------------------------------------
IdAutobus | Marca | Modelo | NombreOperador1 | NombreOperador2 |

Espero que me puedan ayudar, ya que e investigado y no he encontrado un caso similar, de antemano gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:SELECT a una tabla con dos llaves foraneas

Publicado por Angeles (12 intervenciones) el 09/06/2009 12:02:18
Se me ocurre que en vez de tener una sola tabla Operador tengas dos exactamente iguales: Operador1 y Operador2. La sql sería:

SELECT Autobus.IdAutobus, Operador1.Nombre, Operador2.Nombre
FROM (Autobus LEFT JOIN Operador1 ON Autobus.IdOperador1 = Operador1.IdOperador) LEFT JOIN Operador2 ON Autobus.IdOperador2 = Operador2.IdOperador

Saludos, Angeles
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ok, ya probe, pero me marca error...

Publicado por David (6 intervenciones) el 11/06/2009 21:26:40
Bien, ya entendi, y he probado la sentencia, ahora el problema es que me manda este error:

"Mens. 208, Nivel 16, Estado 1, Línea 1
El nombre de objeto 'Operador1' no es válido.
Mens. 208, Nivel 16, Estado 1, Línea 1
El nombre de objeto 'Operador2' no es válido."
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Ok, ya probe, pero me marca error...

Publicado por roger (93 intervenciones) el 11/06/2009 22:33:29
el select debe ser mas o menos asi

select Autobus.idAutobus,op1.nombre,op2.nombre
from Autobus left join Operador op1 on op1.IdOperador = Autobus.IdOperador1
left join Operador op2 on op2.IdOperador = Autobus.IdOperador2

por eso creias que eran dos tablas, pero no, es solo una tabla de Operador
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muchas gracias, ya funciono

Publicado por David (6 intervenciones) el 12/06/2009 07:18:13
Muchas gracias roger, la sentencia funciona, y poniendole un alias a las columnas quedo a la perfeccion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

buena opcion pero...

Publicado por David (6 intervenciones) el 10/06/2009 05:46:41
no debo de hacer eso, la base de datos debe de ser lo mas eficiente que se pueda, ya que el sistema se va a aplicar en una central de autobuses y la carga de trabajo en la base de datos si va a estar pesada. ¿Alguna otra respuesta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:buena opcion pero...

Publicado por roger (93 intervenciones) el 10/06/2009 22:06:24
francamente considero que esa es la respuesta, se hacen dos join distintos, uno para el operador1 y otro para el operador 2, has probado el rendimiento de la consulta???? (no creo que tenga problemas)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Debe haber otra forma....

Publicado por David (6 intervenciones) el 11/06/2009 06:18:16
Tener dos tablas de operadores identicas implicaria hacer doble trabajo en varios procesos, yo creo que debe de haber una forma de crear dos columnas virtuales para los nombres de los operadores se almacenen en ellas y luego mostrarlos junto con la demas informacion de la tabla autobús
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Debe haber otra forma....

Publicado por roger (93 intervenciones) el 11/06/2009 15:27:46
no entiendo lo que dices de "dos tablas de operadores identicas", es una sola tabla, pero el join se hace para las dos, insisto en que revises el rendimiento de la consulta, pues solo son joins entre una y otra tabla, es lo mas normal que he visto para llevar a cabo lo que necesitas, no afecta en nada el diseño de tu base de datos , y la consulta te muestra los datos como los requieres, para nada es una carga extra o innecesaria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SELECT a una tabla con dos llaves foraneas

Publicado por Juan Manuel Castañeda (16 intervenciones) el 30/06/2009 01:51:15
SELECT idAuobus,Marca, Modelo,o1.nombre AS NombreOperador1,o2.Nombre AS NombreOperador2 FROM autobus JOIN Operador o1 ON operador1=o1.IdOperador JOIN Operador o2 ON operador2=o2.IdOperador;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar