sql >> Databáze >  >> RDS >> Oracle

Jak reprezentovat relační dělení (základní algebrický výraz) z hlediska SQL

Vzhledem k tomuto DDL pro tabulky odpovídající vašim relevantním vztahům:

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

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

Vzorec dělení (3) můžete přepsat do syntaxe Oracle SQL poměrně přímočaře, i když je podrobný:

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

Jak je uvedeno, používá pouze CROSS JOIN a MINUS operace tak, aby přímo odpovídaly vzorci relační algebry. V databázové aplikaci v reálném světě by však člověk jistě získal stejný výsledek pomocí zcela jiného dotazu.

Všimněte si také, že databáze SQL mohou a také porušují princip formální relační algebry, že vztahy neobsahují duplicitní n-tice. To je důvod pro SELECT DISTINCT v prvním dílčím dotazu. Odlišný výběr použitý strategicky jinde v dotazu by jej mohl zefektivnit, ale nezměnil by výsledek.



  1. Vlastní dotazy na jaře s JPA

  2. načítání souborů z databáze podle jejich cesty v jsp

  3. Přidejte znak měny £, $ do určitých polí ORACLE

  4. Jaký je nejlepší způsob stránkování výsledků na serveru SQL Server