Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/11/2009, 16:20
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema query

Cita:
Se me olvido decir que los empleados no contratados no tienen ningun null para el asignamiento de restaurante..directamente no tiene ningun codigo de asignamiento (nose si me explico)
Eso no tiene ninguna importancia, porque el NULL aparece cuando realizas un LEFT JOIN entre dos tablas y en la segunda tabla aparecen solamente una parte de los items relacionados de la primera.
Es un asunto de SQL, no de contenido de tablas.

Me explico:
Cuando realizas un JOIN simple entre dos tablas, el DBMS relaciona cada registro de la primea tabla con cada registro de la segunda, donde el contenido de los campos del mismo nombre sea el mismo (motivo por el cual tu consulta original adolece de algunos problemas semánticos que pueden generar un producto cartesiano). Cuando sólo debe considerar uno o algunos campos para igualar se debe indicar en el FROM con la cláusula ON tabla1.campo = tabla2.campo.
Ahora bien, ese es el funcionamiento del JOIN. En el caso del INNER JOIN devovlerá sólo los coincidentes en el ON, realizando la eliminación de los que no poseen coincidencia.
En cambio, cuando se realiza un LEFT JOIN, se le está indicando que devuelva todos los registros de la tabla izquierda y también puede devolver los registros con que coinciden de la tabla derecha; pero el funcionamiento no es excluyente: Cuando un registro de la tabla izquierda no concide, de todos modos lo devuelve, sólo que los restantes campos contienen valores NULL, porque no poseen coincidencias.
El RIGHT JOIN hace exactamente lo mismo, pero con la tabla derecha.

Ahora bien, la lógica de mi consulta se basa en suposiciones inferidas en base a la consulta original: Tienes una tabla que conserva todos los empleados posibles, otra tabla que contiene los restaurantes y una tercera tabla que establece qué empleados trabajan en qué restaurantes.
De esta forma, la consulta propuesta cruza los datos de la primera tabla y la tercera, obteniendo el listado de todos los empleados, y los ID de los restaurantes donde trabajan o NULL en esa columna si no lo tienen. El segundo LEFT JOIN sirve para obtener los nombres de los restaurantes, en aquellos casos en que el valor de ID del restaurante no es un NULL.
En definitiva, esa es la lógica de lo que te propongo.
Lo que si, para que funcione un poco mejor, posiblemente la sintaxis fuera:
Código sql:
Ver original
  1. SELECT DISTINCT
  2.   C.codi_empl,
  3.   C.nom_empl,
  4.   IF(nom_rest IS NULL, 'NO CONTRATADO', nom_rest) nom_rest,
  5.   IF(nom_rest IS NULL, '', num_estrelles) num_estrelles
  6. FROM
  7.   empl_rest C
  8.   LEFT JOIN empleats E USING(codi_empl)
  9.   LEFT JOIN restaurants R USING(codi_rest)
  10. WHERE
  11.   codi_empl IS NOT NULL OR codi_rest IS NULL;
Lo que no debes confundir en este caso es lo que tienes en las tablas con lo que obtienes en las consultas. En casos como el LEFT JOIN hay que conocer la lógica de su funcionamiento para estar seguro de qué es lo que se obtendrá.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)