Ejercicio con query

SQL, mySQL, postgreSQL y otros motores
Responder
Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1057
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Ejercicio con query

Mensaje por Mauricio » Jue Oct 20, 2011 8:45 am

Hola a todos,
les traigo un ejercicio de un curso de base de datos, a ver cómo lo resuelve.
Primero, el script de creación de las tablas:

Código: Seleccionar todo

/* Create the schema for our tables */
create table Highschooler(ID int, name text, grade int);
create table Friend(ID1 int, ID2 int);
create table Likes(ID1 int, ID2 int);

/* Populate the tables with our data */
insert into Highschooler values (1510, 'Jordan', 9);
insert into Highschooler values (1689, 'Gabriel', 9);
insert into Highschooler values (1381, 'Tiffany', 9);
insert into Highschooler values (1709, 'Cassandra', 9);
insert into Highschooler values (1101, 'Haley', 10);
insert into Highschooler values (1782, 'Andrew', 10);
insert into Highschooler values (1468, 'Kris', 10);
insert into Highschooler values (1641, 'Brittany', 10);
insert into Highschooler values (1247, 'Alexis', 11);
insert into Highschooler values (1316, 'Austin', 11);
insert into Highschooler values (1911, 'Gabriel', 11);
insert into Highschooler values (1501, 'Jessica', 11);
insert into Highschooler values (1304, 'Jordan', 12);
insert into Highschooler values (1025, 'John', 12);
insert into Highschooler values (1934, 'Kyle', 12);
insert into Highschooler values (1661, 'Logan', 12);

insert into Friend values (1510, 1381);
insert into Friend values (1510, 1689);
insert into Friend values (1689, 1709);
insert into Friend values (1381, 1247);
insert into Friend values (1709, 1247);
insert into Friend values (1689, 1782);
insert into Friend values (1782, 1468);
insert into Friend values (1782, 1316);
insert into Friend values (1782, 1304);
insert into Friend values (1468, 1101);
insert into Friend values (1468, 1641);
insert into Friend values (1101, 1641);
insert into Friend values (1247, 1911);
insert into Friend values (1247, 1501);
insert into Friend values (1911, 1501);
insert into Friend values (1501, 1934);
insert into Friend values (1316, 1934);
insert into Friend values (1934, 1304);
insert into Friend values (1304, 1661);
insert into Friend values (1661, 1025);
insert into Friend select ID2, ID1 from Friend;

insert into Likes values(1689, 1709);
insert into Likes values(1709, 1689);
insert into Likes values(1782, 1709);
insert into Likes values(1911, 1247);
insert into Likes values(1247, 1468);
insert into Likes values(1641, 1468);
insert into Likes values(1316, 1304);
insert into Likes values(1501, 1934);
insert into Likes values(1934, 1501);
insert into Likes values(1025, 1101); 
Ahora la explicación: hay 3 tablas, una de "alumnos" (HIGHSCHOOLER), una de "amigos" (FRIEND) y otra de "me gusta", LIKES. Si A es amigo de B implica que B es amigo de A, por eso tendremos 2 registros en la tabla FRIEND. Pero si A gusta de B no necesariamente se da la inversa, que B guste de A.
El problema consiste en borrar de la tabla LIKES todos esos casos de amigos que no se gustan mutuamente.
Qué query harían?
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog


Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1057
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: Ejercicio con query

Mensaje por Mauricio » Vie Oct 21, 2011 9:24 am

Bueno, dado que no hubo ninguna respuesta pongo la que encontré yo, si alguien tiene alguna mejor no duden en postearla.
Acá va:

Código: Seleccionar todo

DELETE FROM LIKES 
WHERE EXISTS (SELECT * FROM FRIEND F WHERE F.ID1 = LIKES.ID1 AND F.ID2 = LIKES.ID2) 
AND NOT EXISTS (SELECT * FROM LIKES L WHERE L.ID1 = LIKES.ID2 AND L.ID2 = LIKES.ID1)
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: Ejercicio con query

Mensaje por LeoPalomares » Sab Oct 22, 2011 7:00 am

Che, o yo no entendí la propuesta o tu respuesta no cumple con la misma.
Se trata de dejar solamente las parejas completas, no?
Si es así entonces sería

Código: Seleccionar todo

delete from likes L
where not(L.id1 in(select L1.id2 from likes L1 where L1.id1 = L.id2)
  and L.id2 in(select L2.id1 from likes L2 where L2.id2 = L.id1))
  and exists (select * from friend F where F.id1 = L.id1)
Ahora, si la base de datos tuviera los contraints correspondientes para asegurar que los datos cumplen con las premisas dadas se podría resolver con

Código: Seleccionar todo

delete from likes
where not (id1 in(select id2 from likes)
  and id2 in(select id1 from likes))
Saludos!!!

Leo Palomares

Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1057
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: Ejercicio con query

Mensaje por Mauricio » Sab Oct 22, 2011 7:28 am

Se trata de borrar los que se gustan pero no son amigos. No chequeé tu respuesta pero la mía sé que está bien (al menos así me la corrigieron).
Las tablas no tienen ninguna constraint, es solo un ejercicio.
Por cierto, el curso es de Introducción a las bases de datos que está dando la Universidad de Stanford (es gratuito). Más información en http://www.db-class.org
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 1 invitado