lunes, mayo 29, 2006

[BBDD] Utilización de Exists

Me ha parecido práctico poner este pequeño resumen sobre la utilización de los EXISTS en las consultas anidadas de SQL, que el compañero Juanjo ha dejado en las news. Espero que os sirva.
Utilización de los EXISTS

* Cuando es AL MENOS UNO/ALGUNO se utiliza 1 EXISTS.

Ejemplo:"Obtener los j# de los proyectos donde se utilice AL MENOS UNA de las piezas suministradas por el proveedor s1"

SELECT DISTINCT spjx.j#
FROM spj spjx
WHERE EXISTS
(SELECT *
FROM spj spjy
WHERE spjy.p#=spjx.p#
AND spjy.s#=´s1´)

* Cuando es ÚNICO / ÚNICAMENTE se utiliza NOT EXISTS.

Ejemplo:"Obtener los j# de los proyectos en los que s1 es el ÚNICO proveedor".

SELECT DISTINCT j#
FROM spj spjx
WHERE NOT EXISTS
(SELECT *
FROM spj spjy
WHERE spjy.p#=spjx.p#
AND spjy.s# < > s1´)

* Cuando se trata de TODOS o AL MENOS LOS MISMOS se utilizan 2 NOT EXISTS.

Ejemplo:"Obtener los j# de los proyectos donde se utilicen TODAS las piezas suministradas por el proveedor s1".

SELECT DISTINCT spj.j#
FROM spj
WHERE NOT EXISTS
(SELECT *
FROM spj spjx
WHERE s# = ´s1´ (*CUIDADO¡¡¡la condición no se cambia; no es s#<>s1 *)
AND NOT EXISTS
(SELECT *
FROM spj spjy
WHERE spjy.j#=spjx.j#
AND spjy.p# = spj.p#));

* Cuando se trata de SOLAMENTE también se utilizarán 2, pero a diferencia del anterior en el primer EXISTS no existe condición.

Ejemplo:"Obtener los j# de los proyectos donde se utilicen SOLAMENTE las piezas suministradas por el proveedor s1".

SELECT DISTINCT j#
FROM spj spjx
WHERE NOT EXISTS
(SELECT *
FROM spj spjy
AND NOT EXISTS
(SELECT *
FROM spj spjz
WHERE spjz.p#=spjy.p#
AND spjz.s# = ´s1´));