SELECCIONE * DONDE NO EXISTA


Creo que voy por el camino correcto con este... Por favor, tenga paciencia conmigo ya que mi SQL no es el mayor

Estoy tratando de consultar una base de datos para seleccionar todo de una tabla donde ciertas celdas no existen en otra. Eso no tiene mucho sentido, pero espero que esta pieza de código

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Así que básicamente tengo una tabla con una lista de empleados y sus detalles. Luego otra tabla con algunos otros detalles, incluyendo su nombre. Donde no hay nombre en la tabla eotm_dyn, lo que significa que no hay ninguna entrada para ellos, me gustaría ver exactamente quiénes son, o en otras palabras, ver qué falta exactamente.

La consulta anterior no devuelve nada, pero sé que faltan 20 nombres, así que obviamente no lo he hecho bien.

Alguien Puede ayudar?

 73
Author: Ciaran, 2009-05-27

5 answers

No se unió a la tabla en su consulta.

Su consulta original siempre devolverá nada a menos que no haya registros en absoluto en eotm_dyn, en cuyo caso devolverá todo.

Suponiendo que estas tablas deben unirse en employeeID, use lo siguiente:

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

Puede unir estas tablas con una palabra clave LEFT JOIN y filtrar las NULL, pero esto probablemente será menos eficiente que usar NOT EXISTS.

 123
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-05 09:54:29
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

O

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

O

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
 72
Author: Robin Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 13:20:41

Puede hacer una UNIÓN a la IZQUIERDA y afirmar que la columna unida es NULL.

Ejemplo:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
 10
Author: Mike Tunnicliffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 13:19:59
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Nunca devuelve ningún registro a menos que eotm_dyn esté vacío. Necesitas algún tipo de criterio en SELECT name FROM eotm_dyn como

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

Suponiendo que las dos tablas están vinculadas por una relación de clave foránea. En este punto, podría usar una variedad de otras opciones, incluida una UNIÓN IZQUIERDA. Sin embargo, el optimizador normalmente los manejará de la misma manera en la mayoría de los casos.

 6
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 13:24:26

También puedes echar un vistazo a esta pregunta relacionada. Ese usuario informó que el uso de una combinación proporcionaba un mejor rendimiento que el uso de una consulta secundaria.

 4
Author: Andre Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:19