sql >> Database >  >> RDS >> Oracle

Hoe relationele deling (basisuitdrukking van algebra) in termen van SQL weer te geven?

Gezien deze DDL voor tabellen die overeenkomen met uw relevante relaties:

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

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

U kunt de delingsformule (3) vrij eenvoudig translitereren in Oracle SQL-syntaxis, hoewel het uitgebreid is:

-- 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

Zoals gespecificeerd, gebruikt dat alleen de CROSS JOIN en MINUS bewerkingen, zodat ze direct overeenkomen met de relationele algebra-formule. In een echte databasetoepassing zou men echter zeker hetzelfde resultaat krijgen via een geheel andere zoekopdracht.

Merk ook op dat SQL-databases het principe van formele relationele algebra kunnen schenden dat relaties geen dubbele tupels bevatten. Dat is de reden voor SELECT DISTINCT in de eerste subquery. Duidelijke selectie die strategisch elders in de zoekopdracht wordt toegepast, zou deze efficiënter kunnen maken, maar zou het resultaat niet veranderen.



  1. SQL Server 2012 Service Pack 1 &Cumulatieve Update 1

  2. Samengevoegde gegevens toevoegen aan een queryresultaat

  3. Meerdere afbeeldingsbestanden in een array invoegen in een database

  4. PostgreSQL-clientbibliotheek voor PHP installeren op Windows met SSL ingeschakeld