Duda con CUATRO Select (no veo la diferencia entre ellas)

abmptc
18 de Octubre del 2009
Hola tengo una duda en el siguiente test. Dan como buena la respuesta b) y seguro que esta bien, pero no consigo ver la diferencia entre estas cuatro Select.

¿Cual de las siguientes sentencias SQL obtendría el total de puestos vacantes actualmente, para los que no se exige titulación '010', por unidad y por nivel?

a)
select o.nuni, p.nivel, count(*)
from puesto p, titulaciones o
where p.ffin is null and p.npt =o.npt and o.titulacion <>'010'
and p.npt not in (select npt from actividad a where a.npt=p.npt and a.fces is null)
group by p.nuni, p.nivel

b)
select o.nuni, p.nivel, count(*)
from puesto p
where p.ffin is null and
and p.npt not in (select o.npt from titulaciones o where o.titualciones='010')
and p.npt not in (select npt from actividad a where a.npt=p.npt and a.fces is null)
group by p.nuni, p.nivel

c)
select o.nuni, p.nivel, count(*)
from puesto p, titulaciones o, actividad a
where p.ffin is null and p.npt =o.npt and o.titulacion <>'010'

group by p.nuni, p.nivel

d)
select o.nuni, p.nivel, count(*)
from puesto p, actividad a
where p.ffin is null and
p.npt not in (select o.npt from titulaciones o where o.titualciones='010')
and p.npt=a.npt and a.fces is not null
group by p.nuni, p.nivel


Un saludo.

abmptc
18 de Octubre del 2009
Hola,

Os añado el enunciado íntegro del ejercicio en las siguientes imágenes:

[URL=http://img25.imageshack.us/i/0aprdudacon4select1.jpg/][IMG]http://img25.imageshack.us/img25/4122/0aprdudacon4select1.th.jpg[/IMG][/URL]

[URL=http://img11.imageshack.us/i/0aprdudacon4select2.jpg/][IMG]http://img11.imageshack.us/img11/2423/0aprdudacon4select2.th.jpg[/IMG][/URL]

[URL=http://img269.imageshack.us/i/0aprdudacon4select3.jpg/][IMG]http://img269.imageshack.us/img269/7083/0aprdudacon4select3.th.jpg[/IMG][/URL]

Bien, “creo” que ya he conseguido entender la diferencia entre estas Select. Y estoy de acuerdo en que la respuesta correcta es la b). Voy a intenar explicar mis conclusiones:

Una parte del Where es constante para todos los casos: p.ffin is null por lo que no nos plantea problemas.
Esta condición se pone porque si p.ffin tuviera alguna fecha significaría que ese puesto esta cerrado.

Bien, para explicar el problema podríamos centrarnos en 2 partes:

1ª parte: o.titualciones
1.a) p.npt =o.npt and o.titulacion <>'010'
1.b) p.npt not in (select o.npt from titulaciones o where o.titualciones='010')
En la opción 1.a Estaríamos seleccionando todos los puestos cuyas titulaciones sean distintas de 010. Pero hay puestos que no tienen titulación, por lo que la 1.a estaría mal al no coger los puestos para los que no existe titulación.

2ª parte: a.fces
2.a) p.npt not in (select npt from actividad a where a.npt=p.npt and a.fces is null)
2.b) from puesto p, actividad a where p.npt=a.npt and a.fces is not null
Según el enunciado un puesto puede tener varias actividades. Un puesto esta vacante si TODAS sus actividades tienen alguna fecha en fces, en cuanto alguna actividad tenga este campo a null, el puesto no esta vacante. La opción 2b sería incorrecta ya que generaría para cada puesto varias líneas en el resultado final (una por cada actividad en la cual fces no sea nula), y para un puesto en el resultado final solo puede haber como mucho una línea.

“Creo” que esto explica la solución correcta. Os agradecería que comentarais tanto si estáis de acuerdo con este razonamiento como si veis alguna cosa con la que no estéis de acuerdo.

Un saludo.