/* (8.1) ############################################################################################ Clave de las piezas que son suministradas por más de un proveedor. ##########################################################################################*/ SELECT clvPieza FROM Pieza P WHERE 1<(SELECT count(*) FROM Suministrar WHERE clvPieza = P.clvPieza); /* (8.2) ##########################################################################################*/ SELECT distinct S1.clvPieza FROM Suministrar S1, Suministrar S2 WHERE S1.clvPieza = S2.clvPieza AND S1.clvProv <> S2.clvProv; /* (8.3) ##########################################################################################*/ SELECT distinct clvPieza FROM Suministrar S WHERE EXISTS (SELECT * FROM Suministrar WHERE clvPieza = S.clvPieza AND clvProv < S.clvProv); /* (8.4) ##########################################################################################*/ SELECT distinct clvPieza FROM Suministrar S WHERE EXISTS (SELECT * FROM Proveedor WHERE clvProv < S.clvProv AND (clvProv,S.clvPieza) IN (SELECT * FROM Suministrar)); /* (8.5) ##########################################################################################*/ SELECT clvPieza FROM Suministrar GROUP BY clvPieza HAVING count(*) > 1; /* (8.6) ##########################################################################################*/ SELECT distinct clvPieza FROM Pieza P WHERE EXISTS (SELECT * FROM Proveedor V1, Proveedor V2 WHERE V1.clvProv < V2.clvProv AND (V1.clvProv,P.clvPieza) IN (SELECT * FROM Suministrar) AND (V2.clvProv,P.clvPieza) IN (SELECT * FROM Suministrar)); /* (8.7) ##########################################################################################*/ CREATE VIEW Mas1Prov AS SELECT clvProv, clvPieza FROM Suministrar MINUS SELECT max(clvProv), clvPieza FROM Suministrar GROUP BY clvPieza; SELECT distinct clvPieza FROM Mas1Prov; DROP VIEW Mas1Prov; /* (8.8) ##########################################################################################*/ SELECT distinct clvPieza FROM (SELECT clvProv, clvPieza FROM Suministrar MINUS SELECT max(clvProv), clvPieza FROM Suministrar GROUP BY clvPieza); /* 9 Clave de las piezas que a lo sumo tienen un proveedor */ /* (10.1) ############################################################################################ Clave de los proveedores que sólo suministran un tipo de piezas. ##########################################################################################*/ SELECT distinct clvProv FROM Suministrar S, Pieza P WHERE S.clvPieza = P.clvPieza AND NOT EXISTS (SELECT * FROM Suministrar S2, Pieza P2 WHERE S2.clvPieza = P2.clvPieza AND clvProv = S.clvProv AND P.nombPieza <> P2.nombPieza); /* (10.2) ##########################################################################################*/ CREATE VIEW tpPiezaProv AS SELECT distinct clvProv, nombPieza FROM Suministrar S, Pieza P WHERE S.clvPieza = P.clvPieza; SELECT * FROM tpPiezaProv; SELECT clvProv FROM tpPiezaProv T WHERE 1=(SELECT count(*) FROM tpPiezaProv WHERE clvProv = T.clvProv); DROP VIEW tpPiezaProv; /* (10.3) ##########################################################################################*/ SELECT clvProv FROM (SELECT distinct clvProv, nombPieza FROM Suministrar S, Pieza P WHERE S.clvPieza = P.clvPieza) GROUP BY clvProv HAVING count(*) = 1; /* (10.4) ##########################################################################################*/ SELECT clvProv FROM (SELECT * FROM Suministrar S, Pieza P WHERE S.clvPieza = P.clvPieza GROUP BY clvProv, nombPieza) GROUP BY clvProv HAVING count(*) = 1; /* (10.5) ##########################################################################################*/ SELECT clvProv FROM Suministrar S, Pieza P WHERE S.clvPieza = P.clvPieza GROUP BY clvProv HAVING count(distinct nombPieza) = 1; /* 11 Clave de los proveedores que suministran alguna pieza en exclusiva (sólo ellos) */ /* 12 Clave de los proveedores "prescindibles", pues no suministran ninguna pieza en exclusiva */ /* 13 Parejas (sin repetir ninguna) de proveedores que comparten el suministro de alguna pieza */ /* 14 Proveedor(es) que más piezas suministra del mismo tipo (tuercas, tornillos, etc.) */ /*==========================================================================================*/ /* insertar algunos datos para probar */ INSERT INTO Proveedor VALUES (94, 'ANGEL'); INSERT INTO Proveedor VALUES (95, 'LUIS'); INSERT INTO Proveedor VALUES (96, 'MARIA'); INSERT INTO suministrar VALUES (95, 94); INSERT INTO suministrar VALUES (95, 96); INSERT INTO suministrar VALUES (96, 94); INSERT INTO suministrar VALUES (96, 96); /* (15.1) ############################################################################################ Parejas (sin repetir ninguna) de proveedores suministran exactamente las mismas piezas. ##########################################################################################*/ SELECT DISTINCT V1.clvProv, V2.clvProv FROM Proveedor V1, Proveedor V2 WHERE V1.clvProv < V2.clvProv AND NOT EXISTS( (SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv MINUS SELECT clvPieza FROM Suministrar WHERE clvProv = V2.clvProv) UNION (SELECT clvPieza FROM Suministrar WHERE clvProv = V2.clvProv MINUS SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv)); /* (15.2) ##########################################################################################*/ SELECT DISTINCT V1.clvProv, V2.clvProv FROM Proveedor V1, Proveedor V2 WHERE V1.clvProv < V2.clvProv AND NOT EXISTS( (SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv OR clvProv = V2.clvProv MINUS SELECT S1.clvPieza FROM Suministrar S1, Suministrar S2 WHERE S1.clvProv = V1.clvProv AND S2.clvProv = V2.clvProv AND S1.clvPieza = S2.clvPieza)); /* (15.3) ##########################################################################################*/ SELECT DISTINCT V1.clvProv, V2.clvProv FROM Proveedor V1, Proveedor V2 WHERE V1.clvProv < V2.clvProv AND NOT EXISTS ( SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv OR clvProv = V2.clvProv MINUS ( SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv INTERSECT SELECT clvPieza FROM Suministrar WHERE clvProv = V2.clvProv)); /* (15.4) ##########################################################################################*/ /* si los proveedores tienen que suministrar alguna pieza */ SELECT DISTINCT V1.clvProv, V2.clvProv FROM Suministrar V1, Suministrar V2 WHERE V1.clvProv < V2.clvProv MINUS SELECT S1.clvProv, S2.clvProv FROM Suministrar S1, Suministrar S2 WHERE S1.clvPieza NOT IN (SELECT clvPieza FROM Suministrar WHERE clvProv = S2.clvProv) OR S2.clvPieza NOT IN (SELECT clvPieza FROM Suministrar WHERE clvProv = S1.clvProv); /* (15.5) ##########################################################################################*/ SELECT DISTINCT V1.clvProv, V2.clvProv FROM Proveedor V1, Proveedor V2 WHERE V1.clvProv < V2.clvProv MINUS SELECT V1.clvProv, V2.clvProv FROM Proveedor V1, Proveedor V2 WHERE EXISTS (SELECT clvPieza FROM Suministrar WHERE clvProv = V1.clvProv AND clvPieza NOT IN (SELECT clvPieza FROM Suministrar WHERE clvProv =V2.clvProv)) OR EXISTS (SELECT clvPieza FROM Suministrar WHERE clvProv = V2.clvProv AND clvPieza NOT IN (SELECT clvPieza FROM Suministrar WHERE clvProv =V1.clvProv)); /* (15.6) ##########################################################################################*/ /* si los proveedores tienen que suministrar alguna pieza */ CREATE VIEW nPiezasAmbos (clvProv1, clvProv2, N) AS SELECT S1.clvProv, S2.clvProv, count(*) FROM Suministrar S1, Suministrar S2 WHERE S1.clvProv < S2.clvProv AND S1.clvPieza = S2.clvPieza GROUP BY S1.clvProv, S2.clvProv; SELECT * FROM nPiezasAmbos; CREATE VIEW nPiezasProv (clvProv, N) AS SELECT clvProv, count(*) FROM Suministrar GROUP BY clvProv; SELECT * FROM nPiezasProv; SELECT clvProv1, clvProv2 FROM nPiezasAmbos, nPiezasProv nPz1, nPiezasProv nPz2 WHERE clvProv1=nPz1.clvProv AND clvProv2=nPz2.clvProv AND nPiezasAmbos.N=nPz1.N AND nPiezasAmbos.N=nPz2.N; DROP VIEW nPiezasAmbos; DROP VIEW nPiezasProv; /* (15.7) ##########################################################################################*/ /* si los proveedores tienen que suministrar alguna pieza */ SELECT S1.clvProv, S2.clvProv FROM Suministrar S1, Suministrar S2 WHERE S1.clvProv < S2.clvProv AND S1.clvPieza = S2.clvPieza GROUP BY S1.clvProv, S2.clvProv HAVING count(*) = (SELECT count(*) FROM Suministrar WHERE clvProv = S1.clvProv) AND count(*) = (SELECT count(*) FROM Suministrar WHERE clvProv = S2.clvProv); /*==========================================================================================*/ /* deshacer los cambios realizados */ DELETE FROM Suministrar WHERE clvProv > 90; DELETE FROM Proveedor WHERE clvProv > 90; /*==========================================================================================*/ /* 16 Clave de los proveedores que suministran piezas de todos los colores */ /* 17 Clave de los proveedores que suministran más de dos piezas */ /* 18 Pares de suministradores (S1, S2) tales que S1 suministra todas las piezas que suministra S2 */ /* 19 */