not funciona exist ejemplos drop dont como sql

funciona - not exists sql ejemplos



¿Cómo funcionan las declaraciones SQL EXISTS? (6)

Estoy tratando de aprender SQL y estoy teniendo dificultades para entender las declaraciones EXISTS. Me encontré con esta cita sobre "existe" y no entiendo algo:

Al usar el operador exists, su subconsulta puede devolver cero, una o muchas filas, y la condición simplemente verifica si la subconsulta arrojó cualquier fila. Si observas la cláusula de selección de la subconsulta, verás que consiste en un solo literal (1); dado que la condición en la consulta que contiene solo necesita saber cuántas filas se han devuelto, los datos reales que devuelve la subconsulta son irrelevantes.

Lo que no entiendo es ¿cómo sabe la consulta externa en qué fila está revisando la subconsulta? Por ejemplo:

SELECT * FROM suppliers WHERE EXISTS (select * from orders where suppliers.supplier_id = orders.supplier_id);

Entiendo que si la identificación del proveedor y la tabla de órdenes coinciden, la subconsulta será verdadera y se generarán todas las columnas de la fila correspondiente en la tabla de proveedores. Lo que no entiendo es cómo la subconsulta comunica qué fila específica (digamos la fila con el id. De proveedor 25) debe imprimirse si solo se devuelve un verdadero o falso.

Me parece que no hay relación entre la consulta externa y la subconsulta.


Me parece que no hay relación entre la consulta externa y la subconsulta.

¿Qué crees que está haciendo la cláusula WHERE dentro del ejemplo EXISTS? ¿Cómo se llega a esa conclusión cuando la referencia PROVEEDORES no está en las cláusulas FROM o JOIN dentro de la cláusula EXISTS?

EXISTA valores para VERDADERO / FALSO, y sale como VERDADERO en la primera coincidencia de los criterios; esta es la razón por la que puede ser más rápido que IN . También tenga en cuenta que se ignora la cláusula SELECT en un EXISTS - IE:

SELECT s.* FROM SUPPLIERS s WHERE EXISTS (SELECT 1/0 FROM ORDERS o WHERE o.supplier_id = s.supplier_id)

... debería golpear una división por error cero, pero no lo hará. La cláusula WHERE es la parte más importante de una cláusula EXISTS.

También tenga en cuenta que un JOIN no es un reemplazo directo para EXISTS, porque habrá registros principales duplicados si hay más de un registro secundario asociado al padre.


EXISTS significa que la subconsulta devuelve al menos una fila, eso es realmente. En ese caso, es una subconsulta correlacionada porque comprueba el supplier_id de la tabla externa al supplier_id de la tabla interna. Esta consulta dice, en efecto:

SELECCIONAR a todos los proveedores Para cada ID de proveedor, ver si existe un pedido para este proveedor. Si el proveedor no está presente en la tabla de pedidos, eliminar al proveedor de los resultados. DEVOLVER todos los proveedores que tengan filas correspondientes en la tabla de pedidos.

Usted podría hacer lo mismo en este caso con INNER JOIN.

SELECT suppliers.* FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

Los ponies comentan es correcto. Debería agrupar con esa combinación, o seleccionar distintos según los datos que necesite.


Lo que describes es una llamada consulta con una subconsulta correlacionada .

(En general) es algo que debe intentar evitar escribiendo la consulta utilizando una combinación en su lugar:

SELECT suppliers.* FROM suppliers JOIN orders USING supplier_id GROUP BY suppliers.supplier_id

Porque de lo contrario, la subconsulta se ejecutará para cada fila en la consulta externa.


Piénsalo de esta manera:

Para ''cada'' fila de Suppliers , compruebe si ''existe'' una fila en la tabla de Order que cumpla la condición Suppliers.supplier_id (esto proviene de la consulta externa actual ''row'') = Orders.supplier_id . Cuando encuentre la primera fila coincidente, deténgase allí: el WHERE EXISTS ha sido satisfecho.

El enlace mágico entre la consulta externa y la subconsulta se basa en el hecho de que Supplier_id pasa de la consulta externa a la subconsulta para cada fila evaluada.

O, para decirlo de otra manera, la subconsulta se ejecuta para cada fila de la tabla de la consulta externa.

NO es como que la subconsulta se ejecuta en su totalidad y obtiene el ''verdadero / falso'' y luego intenta hacer coincidir esta condición ''verdadero / falso'' con la consulta externa.


Puede producir resultados idénticos utilizando JOIN , EXISTS , IN o INTERSECT :

SELECT s.supplier_id FROM suppliers s INNER JOIN (SELECT DISTINCT o.supplier_id FROM orders o) o ON o.supplier_id = s.supplier_id SELECT s.supplier_id FROM suppliers s WHERE EXISTS (SELECT * FROM orders o WHERE o.supplier_id = s.supplier_id) SELECT s.supplier_id FROM suppliers s WHERE s.supplier_id IN (SELECT o.supplier_id FROM orders o) SELECT s.supplier_id FROM suppliers s INTERSECT SELECT o.supplier_id FROM orders o


Si tuviera una cláusula Where que se pareciera a esta:

WHERE id in (25,26,27) -- and so on

puede entender fácilmente por qué se devuelven algunas filas y algunas no.

Cuando la cláusula where es así:

WHERE EXISTS (select * from orders where suppliers.supplier_id = orders.supplier_id);

simplemente significa: devolver filas que tienen un registro existente en la tabla de órdenes con el mismo ID.