sql >> Database teknologi >  >> RDS >> Oracle

Hvordan man repræsenterer relationel division (grundlæggende algebra udtryk) i form af SQL

Givet denne DDL for tabeller, der svarer til dine relevante relationer:

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

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

Du kan translitterere divisionsformlen (3) til Oracle SQL-syntaks ret ligetil, selvom den er ordrig:

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

Som specificeret bruger det kun CROSS JOIN og MINUS operationer, således at de svarer direkte til den relationelle algebraformel. I en databaseapplikation i den virkelige verden ville man dog helt sikkert opnå det samme resultat via en helt anden forespørgsel.

Bemærk også, at SQL-databaser kan og gør krænke princippet om formel relationel algebra om, at relationer ikke indeholder duplikerede tupler. Det er grunden til SELECT DISTINCT i den første underforespørgsel. Distinkt valg anvendt strategisk andre steder i forespørgslen kan gøre det mere effektivt, men vil ikke ændre resultatet.



  1. MySQL:Forkert nøglefil til tabellen '/tmp/#sql_185e_0.MYI' prøv at reparere den

  2. Er der en grænse for antallet af tabeller i en SQL Server-database OG -visning?

  3. Er det muligt at udsætte køen fra ANYDATA Synchronous Capture-kø ved hjælp af JDBC?

  4. Hvad er den bedste måde at validere XML mod XML-skema, parse det og gemme data tilbage til MySQL-databasen ved hjælp af Perl?