UTNianos

Versión completa: Final Gestion de datos 19/07/2011
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas gente subo el final de GDD del 19/07/2011 con mi resolucion para aportar/corregir.
Slds

Mi resolución (me saqué 8):

1.a) nunca lo probe pero creo que es VERDADERO

1.b) VERDADERO

---

2.a)

- Una tabla en la que se hagan muchos insert, update, delete y pocos select.
- Si el índice está en una columna de la tabla que nunca se usa en WHERE, ORDER BY, etc.

2.b)

Transacciones: Es un conjunto de sentencias que se ejecutan atomicamente. Permiten mantener de la DB en estado correcto partiendo de un estado correcto. Asegurando que el la operacion se ejecuta completa o falle dejando todo como estaba de un principio.
Las directivas que provee el DBMS son:
Begin Transaction
commit
rollback
Se da comienzo a la transaccion luego de la sentencia Begin transaction, a partir de la misma comienza la ejecucion atomica hasta que se cierre con un rollback (en caso de que alla ocurrido un error para volver al punto de partida antes de q se comience a ejecutar la transaccion) o con un commit (en el caso exitoso para confirmar los cambios efectuados dentro de la transaccion)


---

3)

select p1.nombre,isnull(p2.nombre,'sin hermano')
from persona p1 left outer join persona p2 on (p1.madre=p2.madre )
where p1.id!=p2.id and p1.id<p2.id

no me aparecen los que no tienen hermanos, alguna solucion??

4)
create trigger mf on persona
after insert,update
begin transaction
if exists(select id from persona where sexo='F' and id in (select distinct padre from persona))
begin
rollback transaction
raiserror ("Se encontro una persona que no condice con el genero asignado")
end

if exists(select id from persona where sexo='M' and id in (select distinct madre from persona))
begin
rollback transaction
raiserror ("Se encontro una persona que no condice con el genero asignado")
end
commit transaction
Lo mas cerca que estuve a resolverlo, no se me ocurrio todavia otra cosa.
El problema: si son hnos por que comparten padre y madre a la vez, aparece una vez mas (uno de ellos) como si no tuviera hnos.


create table familia(
id varchar(2), padre varchar(2), madre varchar(1) )

insert into familia(id,madre) values('L','M')
insert into familia values ('A','P','M')
insert into familia(id,padre,madre) values ('R','P','M')
insert into familia(id,padre) values ('C','P')
insert into familia(id,padre) values ('Y','Z')
insert into familia(id) values ('M')
insert into familia(id) values ('P')
insert into familia(id) values ('Z')

select h.id,isnull(h2.id,'sin hnos')
from familia as h left join familia as h2 on ( (h2.madre=h.madre or h2.padre=h.padre ) and h2.id>h.id )




SELECT H1.NOMBRE AS NOMBREPERSONA, ISNULL(H2.NOMBRE,'SIN HERMANOS') AS NOMBREHERMANO
FROM Persona H1
JOIN Persona H2
ON H1.ID < H2.ID
AND (H1.MADRE = H2.MADRE OR H1.PADRE = H2.PADRE)
UNION
SELECT NOMBRE AS NOMBREPERSONA, 'SIN HERMANOS' AS NOMBREHERMANO FROM Persona WHERE ID NOT IN (SELECT H1.ID
FROM Persona H1
LEFT JOIN Persona H2
ON (H1.MADRE = H2.MADRE OR H1.PADRE = H2.PADRE)
WHERE H1.ID <> H2.ID);


La única manera en la que pude resolverlo fue así, pero seguro hay otra forma menos cochina de resolverlo...

Spoiler: Mostrar
Im not proud of it, but it works...
ramiro99 hola! Gracias por ayuda
(14-02-2018 15:34)ramiro99 escribió: [ -> ]


SELECT H1.NOMBRE AS NOMBREPERSONA, ISNULL(H2.NOMBRE,'SIN HERMANOS') AS NOMBREHERMANO
FROM Persona H1
JOIN Persona H2
ON H1.ID < H2.ID
AND (H1.MADRE = H2.MADRE OR H1.PADRE = H2.PADRE)
UNION
SELECT NOMBRE AS NOMBREPERSONA, 'SIN HERMANOS' AS NOMBREHERMANO FROM Persona WHERE ID NOT IN (SELECT H1.ID
FROM Persona H1
LEFT JOIN Persona H2
ON (H1.MADRE = H2.MADRE OR H1.PADRE = H2.PADRE)
WHERE H1.ID <> H2.ID);


La única manera en la que pude resolverlo fue así, pero seguro hay otra forma menos cochina de resolverlo...

Spoiler: Mostrar
Im not proud of it, but it works...

Lo hice sin mirar tu respuesta y llegué a lo mismo que vos jaja, nos vemos en un rato =P
Buenas, les dejo mis resoluciones sobre el ejercicio practico, si ven algún error les agradezco que me lo digan asi lo vemos. Saludos

--PARTE A
SELECT P1.NOMBRE AS PERSONA, P2.NOMBRE AS HERMANO FROM PERSONA P1 INNER JOIN PERSONA P2 ON P1.ID=P2.ID
WHERE (P1.PADRE = P2.PADRE AND P1.PADRE IS NOT NULL) OR (P1.MADRE = P2.MADRE AND P1.MADRE IS NOT NULL) AND P1.ID <> P2.ID
UNION SELECT DISTINCT(P.NOMBRE) AS PERSONA, 'SIN HERMANOS' FROM PERSONA P WHERE P.PADRE IS NULL OR P.MADRE IS NULL

--PARTE B

CREATE TRIGGER SEXO_PERSONAS ON PERSONAS
AFTER INSERT, UPDATE
AS
BEGIN

UPDATE PERSONA
SET SEXO = 'M'
WHERE ID IN (SELECT P1.ID FROM PERSONA P1 WHERE P1.ID IN (SELECT P2.PADRE FROM PERSONA P2 ) AND P1.SEXO <> 'M')


UPDATE PERSONA
SET SEXO = 'M'
WHERE ID IN (SELECT P1.ID FROM PERSONA P1 WHERE P1.ID IN (SELECT P2.MADRE FROM PERSONA P2 ) AND P1.SEXO <> 'F')

END
URLs de referencia