Duda con CUATRO Select (no veo la diferencia entre ellas)
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.
¿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.
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.
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.
