UTNianos

Versión completa: [Aporte] Final Gestión de Datos 6-03-2012
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Gente, ¿cómo andan?. Dejo un estimativo de lo que fue el final, ya que no pude conseguirlo en papel. Si alguien puede hacerlo, se lo agradezco así las consignas quedan más claras.

Punto 1

1a) Si se tiene una vista que relaciona varias tablas y una de ellas posee un índice, el motor no puede utilizarlo para generar una consulta más performante.

Falso. Lo que no se puede hacer es generar un índice sobre una vista.

1b) Se puede ejecutar un store procedure en una consulta SELECT

Falso. Debería hacer un exec del mismo y no se puede (Ahora lo voy a probar igualmente)

Punto 2

2a) Describir lo que es un Datawarehouse. Indicar que papel juega la desnormalización en el mismo.

Lo de datawarehouse está en el apunto, igual que lo de desnormalización

2b) Indica que es un plan de ejecución y cual es su finalidad.

Un plan de ejecución es una forma predeterminada de ejecutar una consulta. El optimizador de consultas crea varios planes de consulta, varias formas de ejecución de una consulta, cuando uno ejecuta una. Después se van otorgando pesos a los mismos en función del tiempo de CPU ocupado, tiempo de E/S utilizado, etc. Cuando se termina ese proceso, se elije la que menos pondera y se almacena para posterior ejecución. Su finalidad?, la de ejecutar con mayor performance las consultas.

Ejercicios

3a) Una tabla recursiva (una tabla que apunta a si misma) llamada Persona con la siguiente información:


Id
---------
Nombre
Apellido
Dirección
Su_padre_es

Su_padre_es es un Id también

Mostrar los apellido y nombre de los tíos de un ID dado.

La consulta sería algo como:

SELECT P4.Apellido, P4.Nombre
FROM Persona P1, Persona P2, Persona P3, Persona P4
WHERE @ID_Persona = P1.Id AND P1.Su_padre_es = P2.Id AND P2.Su_padre_es = P3.Id AND P4.Su_padre_es = P3.Id
/* Ok, imaginemos que yo soy el del ID, lo que hago es matchear con otra tabla "Persona" el Id de mi viejo y en la tabla P2 voy a tener los datos de mi viejo. Voy a la tabla P3 y ahí tengo el Id de mi abuelo y después pido condición para que en P4 esten todos los que tienen de mismo padre a mi abuelo, o sea, mis tíos y mi viejo, pero bueno, ahí no dice que no tengo que mostrarlo =P. Tampoco dice que había que contemplar NULLS's. De última lo vemos si quieren saberlo... */

3b) Era un trigger AFTER INSERT con UPDATES (hay que ver en cada caso). Se tenía que cumplir en la tabla la condición de que :"Todos los hermanos tienen que tener el mismo apellido".

Saludos y espero que sirva
1a FALSA
1b FALSA
2a Regalado, DW
2b Optimizador de consulta, plan de ejecucion, etc.
3a La tabla ya estaba en otro final, la diferencia que en vez de pedir hermanos pedía tios, y que en caso de no haber, que no devuelva nada, para un id dado.

SELECT P.Apellido, P.Nombre
FROM Persona p inner join persona pp on
p.su_padre_es = pp.su_padre_es inner join persona ppp on
ppp.su_padre_es = pp.id where ppp.id=@id

Hago la inversa.. devuelvo los tios.. de aquellos que tengan un hermano... que sea el padre de un id, cuyo id sea = al id dado.

3b Trigger after insert,update. y rollback transaction
tambien podia ser con cursor si lo querias para un insert masivo
si era para solo 1 no hacia falta. decia que la tabla actualmente no hacia falta controlarla, entonces con controlar 1 hermano solo bastaba y sobraba (porque ese hermano ya era hermano de todos los otros si o si de la BD)

1h15 aprox
3.a )

select ( select P2.apellido+','+P2.nombre from persona p2 where p1.id != p2.id and p2.su_padre_es in (select su_padre_es from persona p3 where p2.id != p3.id and p2.su_padre_es = p3.su_padre_es and p3.id in (select su_padre_es from persona p4 where id = @id ) ) ) from persona p1

O sea, traigo "Apellido, Nombre" de personas que tengan hermanos y que ese hermano sea padre del id pasado como parámetro (@id)

3.b)

create trigger FINAL on persona
for insert,update
as
begin transaction

if exists (select 1 from persona p inner join inserted i on p.su_padre_es = i.su_padre_es and p.apellido != i.apellido)
begin
raiserror('Hay hermanos con apellidos distintos',10,2)
rollback transaction
end

si se quiere insertar un hno de alguien que ya esta en la tabla, y tiene apellido distinto, el exists da true y se rollbackea todo ..

la teoría coincido en todo lo que pusieron =)
3-a lo pense de la siguiente manera:

select * from persona t3 where t3.id_padre in (
select t2.id_padre
from persona t1,persona t2
where t1.id_padre=t2.id and
t1.id=1 and t3.id!=t1.id_padre)

obtengo el abuelo y discrimino al padre:
(select t2.id_padre
from persona t1,persona t2
where t1.id_padre=t2.id and
t1.id=1 and t3.id!=t1.id_padre)

digo q me muestre a los hijos del abuelo:
select * from persona t3 where t3.id_padre in

slds
URLs de referencia