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 originalSELECT DISTINCT
C.codi_empl,
C.nom_empl,
IF(nom_rest IS NULL, 'NO CONTRATADO', nom_rest) nom_rest,
IF(nom_rest IS NULL, '', num_estrelles) num_estrelles
FROM
empl_rest C
LEFT JOIN empleats E USING(codi_empl)
LEFT JOIN restaurants R USING(codi_rest)
WHERE
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á.