sql >> Databasteknik >  >> RDS >> Oracle

Hur man representerar relationsdelning (grundläggande algebrauttryck) i termer av SQL

Givet denna DDL för tabeller som motsvarar dina relevanta relationer:

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

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

Du kan translitterera divisionsformeln (3) till Oracle SQL-syntax ganska enkelt, även om den är utförlig:

-- 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 specificerat använder det endast CROSS JOIN och MINUS operationer, så att de direkt motsvarar den relationella algebraformeln. I en verklig databasapplikation skulle man dock säkert få samma resultat via en helt annan fråga.

Observera också att SQL-databaser kan bryta mot principen för formell relationalgebra att relationer inte innehåller dubbletter av tupler. Det är anledningen till SELECT DISTINCT i den första underfrågan. Distinkt urval som tillämpas strategiskt på andra ställen i frågan kan göra det mer effektivt, men skulle inte förändra resultatet.



  1. Frågar i MySQL db

  2. Hur man får värdet på autoinkrement av sista raden vid infogningen

  3. Fel med PHP-kommandon ur synkronisering

  4. IntegrityError dubblettnyckelvärde bryter mot unik begränsning - django/postgres