==================================================================
Universidad Nacional de Lujan
Departamento de Ciencias Basicas
Division Estadistica y Sistemas
11165 Base de Datos - 10165 Programacion Aplicada
Lic. Guillermo Cherencio
Consultas en SQL
===================================================================

DADAS LAS SIGUIENTES RELACIONES:
===============================

PROD(PROD)
SUCPROD(SUC,PROD)

Se pretende obtener el resultado de:
R := SUCPROD / PROD

Ejemplo:
Relacion SUCPROD con las siguientes tuplas:
SUC	PROD
1	1
1	3
1	4
2	3
2	4
3	1
5	3
Relacion PROD con las siguientes tuplas:
PROD
1
3
4
La relacion R debera tener las siguientes tuplas:
SUC
1

Dado que la sucursal 1 es la unica asociada con todos los productos.
Idea expresada en Algebra para luego ser llevada a SQL

P1 := SUCPROD[SUC]
PXS := (PROD * P1)[SUC,PROD]
P2 := (PXS - SUCPROD)[SUC]

La relacion P2 contiene todas las sucursales que no estan combinadas con
todos los productos posibles.
La solucion seria todas las sucursales que no se encuentran en P2.

Implementacion en SQL:
	Supongamos que nuestro SGBD no soporta la clausula MINUS para 
realizar la resta asi como tampoco la posibilidad de expresar subqueries
en la clausula FROM. 
	La resolucion de la resta podria hacerse con un left join, pre-
guntando por los valores nulos de la otra tupla (los cuales serian aquellos
que se encuentran en la primera relacion y no en la segunda), esas serian
las tuplas resultantes de la resta (ya que, si las tuplas se encuentran en
ambas relaciones, estas no son parte de la soluacion).
	Una implementacion posible de la idea anterior seria:

-- Consultas pregrabadas para ser reutilizadas en distintas consultas
Primero resuelvo el producto cartesiano entre PROD y SUCPROD (PXS):

CREATE VIEW PROD_X_SUCROD AS
SELECT DISTINCT SP.SUC, P.PROD
FROM PROD AS P, SUCPROD AS SP;

Luego resuelvo la resta (a traves de un left join) entre el producto cartesiano
(PXS) menos SUCPROD, proyecto por sucursal y me aseguro que la sucursal a mostrar
como resultado de la consulta no se encuentre en este conjunto de sucursales:

SELECT DISTINCT SUC FROM SUCPROD WHERE SUC NOT IN(
SELECT DISTINCT PXS.SUC FROM PROD_X_SUCPRO AS PXS LEFT JOIN SUCPROD AS SP  ON PXS.PROD = SP.PROD AND PXS.SUC = SP.SUC
WHERE SP.SUC IS NULL AND SP.PROD IS NULL)
