Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como representar a divisão relacional (expressão de álgebra básica) em termos de SQL


Dado este DDL para tabelas correspondentes às suas relações relevantes:
create table Boats(
  bid int,
  bname varchar(50),
  color varchar(50)
);

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

Você pode transliterar a fórmula de divisão (3) para a sintaxe Oracle SQL de maneira bastante direta, embora seja detalhada:
-- 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

Conforme especificado, isso usa apenas o CROSS JOIN e MINUS operações, de modo a corresponder diretamente à fórmula da álgebra relacional. Em um aplicativo de banco de dados do mundo real, no entanto, certamente obteria o mesmo resultado por meio de uma consulta totalmente diferente.

Observe também que os bancos de dados SQL podem violar o princípio da álgebra relacional formal de que as relações não contêm tuplas duplicadas. Essa é a razão para SELECT DISTINCT na primeira subconsulta. A seleção distinta aplicada estrategicamente em outra parte da consulta pode torná-la mais eficiente, mas não alteraria o resultado.