SQL help

tada

Saludos mediavideros!

Actualmente estoy haciendo un trabajillo para la universidad y estoy implementando una base de datos. El problema viene a la hora de resolver algunas cosillas en lo relacionado al SQL.

La pregunta es sencilla, necesito sacar de estas tablas (ver imagen) "las cadenas hoteleras en las que ha trabajado el empleado "Pepito", con el identificador de la cadena hotelera me vale.

Los datos del empleado están en "Empleat", en "Contracte" todos los contratos de los empleados (es un historico).

Tablas:

Se que no puede ser muy dificil y tal vez lo consiga en un momento de inspiración (o prueba y error xD) pero sentía curiosidad por ver el nivel de los desarrolladores mediavideros! y de paso a ver si alguien me ayuda :P

Amazon

Hace mucho que no uso SQL, pero creo que es algo así, mira a ver si te funciona

select hotel.nom from empleat, hotel, contracte where empleat.nom like "Pepito" and hotel.id_hotel like empleat.id_hotel and contracte.id_hotel like hotel.id_hotel and contracte.id_empleat like empleat.id_empleat

En caso de que funcione, se puede acortar obviamente

1 respuesta
tada

#2 No devuelve ningun dato, a parte lo que necesito son "cadena.identificador" que no has tenido en cuenta, pero gracias por el try!

Thanat0s
SELECT id_cadena FROM hotel WHERE id_hotel IN (SELECT id_hotel FROM contrate A, empleat B WHERE A.id_empleat=B.id_empleat AND B.nom="Pepito") GROUP BY id_cadena;

Hace mucho que no hago cosas de estas, pero si no recuerdo mal podría ser algo así.

1 1 respuesta
Soltrac

Joder no sois ni complicados me cago en la puta.

SELECT DISTINCT cadena.identificador
FROM cadena, hotel, contracte, empleat
WHERE cadena.id_cadena = hotel.id_cadena AND
           contracte.id_hotel = hotel.id_hotel AND
           contracte.id_empleat = empleat.id_empleat AND
           empleat.nom LIKE 'Pepito'
1 1 respuesta
tada

#4 #5 Correctas las dos! :D

He conseguido otra forma, lo que no se cual sería la mas correcta..

SELECT ca.identificador
FROM contracte AS c 
         LEFT JOIN hotel AS h ON h.id_hotel = c.id_hotel 
         LEFT JOIN empleat AS e ON e.id_empleat = c.id_empleat 
         LEFT JOIN cadena AS ca ON ca.id_cadena = h.id_cadena
WHERE e.nom = 'Pepito' 
GROUP BY c.id_hotel 
1 respuesta
Soltrac

#6 cambia left join por inner join.

1 respuesta
tada

#7 Alguna diferencia a tener en cuenta?

Edito para no llenar de post:

#9 Gracias, muy aclaratoria tu explicación. Supongo que me decantaré por el LEFT ya que como dices en mi caso no hay valores nulos.

1 respuesta
Soltrac

#8

http://answers.yahoo.com/question/index?qid=20070427082608AA7DwSh

Básicamente es para incluir todos los registros de una de las tablas.

Por ejemplo, imagínate un par de conjuntos así.

Tabla1 --- Valores 1 , 2 , 3 , 4 , 5
Tabla2 --- Valores a, NULL, c, d, NULL

Suponiendo que se emparejan uno a uno (imagina un SELECT que te los emparejara), un INNER JOIN entre tabla1 y tabla2 daría (1,a) - (3,c) - (4,d) y un LEFT JOIN daría (1,a) - (2,NULL) - (3,c) - (4,d) - (5,NULL).

De todas formas, tal y como dice ahí, en MySQL en determinados casos LEFT JOIN es incluso más rápido que INNER JOIN. En tu ejemplo puedes usar LEFT JOIN porque al ser siempre uniones entre claves primarias nunca van a existir valores NULL.

Aquí explican mejor lo de la velocidad:

http://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server

1 respuesta
dagavi

#6 Entre la #4 #5 y #6 la menos correcta es #4 por hacer una subconsulta. En la mayoría de asignaturas de BD te impedirán usarlas (para que te acostumbres).

Después la de #5 pues está realizando Joins con el "where" cuando tienes cosas dedicadas especialmente a las JOINS (como has usado en #6 o te han comentado después).

1 respuesta
Thanat0s

#10 Recuerdo que en el examen de FBD nos obligaban a usar subconsultas en algunas preguntas, en otras como tú dices, nos obligaban a no usarlas.

Lo suyo es aprender de todas las formas posibles, digo yo, aunque luego termines usando las más eficientes.

Usuarios habituales

  • Thanat0s
  • dagavi
  • Soltrac
  • tada
  • Amazon