lunes, 23 de mayo de 2011

Soluciones T11 (por dificultad)

Dificultad A

T11.002- Utilizando operadores de conjuntos obtener los nombres de los artículos que sean cámaras compactas con visor electrónico o televisores CRT.
select nombre from camara, articulo
where camara.cod = articulo.cod
and tipo like '%compacta%visor%electrónico%'
union
select nombre from tv, articulo
where tv.cod = articulo.cod
and panel like '%televisor%CRT%'

T11.004- Nombre y email de los usuarios de Asturias que tengan la misma dirección de envió que de residencia (por defecto es la misma dirección si no se especifica una dirección de envío).
select u.nombre, email from usuario u, provincia p
where u.provincia = codp
and p.nombre = 'Asturias'
and not exists(
select * from direnvio d
where u.email = d.email
)
O bien:
SELECT u.nombre, email FROM usuario u 
JOIN provincia p ON (u.provincia = codp)
WHERE p.nombre = 'Asturias' AND email NOT IN (SELECT email FROM direnvio)

T11.007- Utilizando operadores de conjuntos, muestra los nombres de los artículos que estén en un pack.
SELECT nombre
FROM articulo
WHERE EXISTS
(SELECT * FROM ptienea WHERE cod = articulo);

T11.008- Utilizando el producto cartesiano, obtener los nombres de las localidades con 2 o más usuarios. Realizar lo mismo utilizando el GROUP BY.
select distinct l.pueblo
from usuario u1, usuario u2, localidad l
where u1.email != u2.email
and u1.pueblo = u2.pueblo
and u1.provincia = u2.provincia
and u1.pueblo=l.codm
and u1.provincia=l.provincia
Explicación: Siendo distinto el email (es decir, siendo usuarios diferentes) y con la condición de que posean misma provincia y mismo pueblo; sacar el nombre de dicho pueblo. De aquí
se entiende que para dos usuarios distintos y con el mismo pueblo-provincia, se tiene al menos a estos dos usuarios con un mismo pueblo-provincia; por tanto se cumple la condición más
relevante del ejercicio (obviando el distinct y las claves ajenas bien definidas)
Group by:
select localidad.pueblo from localidad, usuario
where usuario.provincia = localidad.provincia
and usuario.pueblo = localidad.codm
group by localidad.pueblo
having count(localidad.pueblo) > 1

T11.009- Los códigos de los artículos que están en stock, en la cesta y han sido pedidos.
SELECT DISTINCT s.articulo 
FROM stock s, cesta c, linped l 
WHERE s.articulo = c.articulo AND s.articulo = l.articulo;
Con conjuntos sería
select articulo from cesta
INTERSECT
select articulo from stock
INTERSECT
select articulo from linped

T11.011- Códigos de artículos que están en alguna cesta o en alguna línea de pedido.
select articulo from cesta
union
select articulo from linped;

T11.013- Apellidos que se repitan en más de un usuario (sin utilizar group by).
select distinct u1.apellidos from usuario u1, usuario u2
where u1.email != u2.email
and u1.apellidos = u2.apellidos;

T11.014- Parejas de nombres de provincia que tienen algún pueblo que se llama igual, junto con el nombre del pueblo.
select p1.nombre, p2.nombre, l1.pueblo
from provincia p1, provincia p2, localidad l1, localidad l2
where p1.codp<>p2.codp 
 and p1.codp=l1.provincia 
 and p2.codp=l2.provincia 
 and l1.pueblo=l2.pueblo;

Dificultad B

T11.001- Listado de los códigos de los artículos Samsung que han sido pedidos.
select cod from articulo a, linped l
where cod = l.articulo
and marca = 'Samsung'

T11.003- Utilizando operadores de conjuntos obtener el nombre de los usuarios, la localidad y la provincia de los usuarios que sean de un pueblo que contenga 'San Vicente' o que sean de la provincia de 'Valencia'.
select distinct u.nombre, l.pueblo, p.nombre from usuario u, localidad l, provincia p
where u.provincia = l.provincia
and u.pueblo = codm
and l.provincia = codp
and l.pueblo like 'San V%Raspeig%'
union
select distinct u.nombre, l.pueblo, p.nombre from usuario u, localidad l, provincia p
where u.provincia = l.provincia
and u.pueblo = codm
and l.provincia = codp
and p.nombre like 'Valencia%'

T11.005- Necesito comprar los objetivos con focales de 500 o 600 mm para todas las marcas con las que trabajo para los que no tengo registrado todavía en artículos y necesito saber cuáles tengo que comprar.
SELECT DISTINCT focal, m.marca 
FROM objetivo o, marca m, articulo a 
WHERE a.cod = o.cod AND (focal = '500 mm' OR focal = '600 mm') 
 AND (focal,m.marca) NOT IN 
 (SELECT DISTINCT focal, a.marca FROM objetivo o 
 JOIN articulo a ON (o.cod = a.cod));

T11.006- Código y precio de los artículos 'Samsung' que tengan pvp y que no tengan pedidos.
select distinct cod, marca, pvp from articulo
where marca = 'Samsung'
and pvp is not null
and not exists (select * from linped
where linped.articulo = cod)

T11.010- Todos los artículos, aunque estén repetidos, que aparezcan en un pack o en una cesta.
select p.articulo, a.nombre
from ptienea p, articulo a
where p.articulo = a.cod
union all
select c.articulo, a.nombre
from cesta c, articulo a
where c.articulo = a.cod

T11.017- Usuarios que han solicitado pedidos de importe superior a 10000 (por pedido) o que han solicitado más de 5 artículos distintos entre todos sus pedidos.
select p.usuario from linped l, pedido p
where l.numPedido = p.numPedido
group by p.usuario
having sum((precio*cantidad))>10000
union
select p.usuario from linped l, pedido p
where l.numPedido = p.numPedido
group by p.usuario
having count(distinct articulo)>5

No hay comentarios:

Publicar un comentario