SQL - SQL - Parejas simétricas

 
Vista:

SQL - Parejas simétricas

Publicado por NaTy (1 intervención) el 25/09/2010 23:34:55
Hola, qué tal?, quisiera hacerles la siguiente consulta.
Me encuentro preparando una prueba de SQL, y me he cruzado un ejercicio que dice asi:

Obtener las parejas de sucursales (idSucursal1, idSucursal2) que tienen exactamente las
mismas películas, sin considerar la cantidad de ejemplares que existen en cada una de ellas.
ATENCION: no deben devolverse parejas simétricas.

(La realidad se basa en un video club).
Las tablas para esta consulta sin las siguientes:

-inventario (id_pelicula, id_sucursal, cant_ejemplares)
Representa las películas que están catalogadas en cada sucursal.

-peliculas (id_pelicula, titulo, descripcion, anio, id_idioma_original, duracion,
duracion_alquiler, costo_alquiler, costo_reemplazo, clasificacion, contenidos_extra)

El tema es que he tratado por todos los medios de sacarla pero no me ha salido, alguien podría darme ayudarme?

Les dejo lo que he hecho al momento pero que no he tenido suerte:

SELECT a.id_sucursal as idSucursal1 , b.id_sucursal as idSucursal2
FROM inventario a, inventario b
WHERE a.id_pelicula=b.id_pelicula
GROUP BY a.id_sucursal, b.id_sucursal
HAVING count (a.id_pelicula)= count(b.id_pelicula)
ORDER BY a.id_sucursal

He intentado con JOIN a la tabla peliculas pero tampoco me da un resultado valido.
Y aun no he analizado como hacer para que no me muestre las simetricas.

Si me pueden ayudar a entender estaria super agradecida!!!

Saludos y muchas gracias,

NaTy
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:SQL - Parejas simétricas

Publicado por Fernando (1 intervención) el 28/09/2010 00:35:52
Esta es una solucion implementable en una base de datos Oracle:

-- Creamos una tabla de inventario y asignamos aleatoriamente
-- peliculas a las sucursales 1, 2 y 3.

create table inventario as
select id_sucursal, id_pelicula, sum(cantidad) cant_ejemplares
from
(select
trunc(dbms_random.value(1,4)) id_sucursal,
trunc(dbms_random.value(1,10)) id_pelicula,
trunc(dbms_random.value(1,10)) cantidad
from dba_tables
where rownum < 20)
group by id_sucursal, id_pelicula
/

Table created.

-- A la sucursal 4 le asignamos las mismas peliculas que a la 1

insert into inventario (select 4, id_pelicula, trunc(dbms_random.value(1,10))
from inventario where id_sucursal = 1)
/

5 rows created.

-- A la sucursal 5 le asignamos las mismas peliculas que a la 2

insert into inventario (select 5, id_pelicula, trunc(dbms_random.value(1,10))
from inventario where id_sucursal = 2)
/

4 rows created.

-- Verificamos como quedo la tabla

select * from inventario order by id_sucursal, id_pelicula
/

ID_SUCURSAL ID_PELICULA CANT_EJEMPLARES
----------- ----------- ---------------
1 1 8
1 2 13
1 3 2
1 4 8
1 9 8
2 1 4
2 3 17
2 5 18
2 6 4
3 1 12
3 4 13
3 5 5
3 6 9
4 1 6
4 2 6
4 3 6
4 4 2
4 9 7
5 1 5
5 3 4
5 5 2
5 6 3

22 rows selected.

-- Ahora obtener las parejas de sucursales que tienen exactamente las
-- mismas películas, sin considerar la cantidad de ejemplares que existen en cada una de ellas.
-- y sin retornar parejas simétricas.

with stock as (
select id_sucursal sucursal, max( sys_connect_by_path( id_pelicula, ',') ) pelicula
from
(select inventario.*, row_number() over (partition by id_sucursal order by id_pelicula) rn
from inventario)
start with rn = 1
connect by prior rn = rn-1 and prior id_sucursal = id_sucursal
group by id_sucursal
)
select a.sucursal, b.sucursal
from stock a, stock b
where a.pelicula = b.pelicula
and a.sucursal <> b.sucursal
/

SUCURSAL SUCURSAL
---------- ----------
4 1
5 2
1 4
2 5

-- Por ultimo, limpiamos el entorno de trabajo.

drop table inventario
/

Table dropped.

SQL>

Un saludo,
Fernando
http://comunidadoraclehispana.ning.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar