sql >> Base de Datos >  >> RDS >> Oracle

Cómo representar la división relacional (expresión de álgebra básica) en términos de SQL

Dado este DDL para tablas correspondientes a sus relaciones relevantes:

create table Boats(
  bid int,
  bname varchar(50),
  color varchar(50)
);

create table Reserves(
  sid int,
  bid int,
  day date
);

Puede transliterar la fórmula de división (3) a la sintaxis de Oracle SQL de manera bastante sencilla, aunque es detallada:

-- All sailors who reserved at least one boat
SELECT DISTINCT sid
FROM Reserves

MINUS 

-- All sailors who reserved at least one boat, but not all of them
SELECT sid
FROM (
  -- all combinations of a sailor who reserved any boat with any boat
  -- available to be reserved:
  SELECT Reserves.sid, Boats.bid
  FROM
    Reserves
    CROSS JOIN
    Boats

  MINUS

  -- all combinations of sailor and boat for actual reservations made
  SELECT sid, bid
  FROM Reserves
) sids

Como se especifica, eso usa solo CROSS JOIN y MINUS operaciones, a fin de corresponder directamente a la fórmula del álgebra relacional. Sin embargo, en una aplicación de base de datos del mundo real, seguramente se obtendría el mismo resultado a través de una consulta completamente diferente.

Tenga en cuenta también que las bases de datos SQL pueden violar y violan el principio del álgebra relacional formal de que las relaciones no contienen tuplas duplicadas. Esa es la razón de SELECT DISTINCT en la primera subconsulta. La selección distinta aplicada estratégicamente en otra parte de la consulta podría hacerla más eficiente, pero no alteraría el resultado.