Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да представим релационно разделение (основен алгебраичен израз) по отношение на SQL

Предвид този DDL за таблици, съответстващи на вашите съответни релации:

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

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

Можете да транслитерирате формулата за деление (3) в синтаксиса на Oracle SQL доста лесно, въпреки че е многословна:

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

Както е посочено, това използва само CROSS JOIN и MINUS операции, така че да съответства директно на формулата на релационната алгебра. В приложение за база данни от реалния свят обаче човек със сигурност ще получи същия резултат чрез напълно различна заявка.

Обърнете внимание също, че SQL базите данни могат и наистина нарушават принципа на формалната релационна алгебра, че отношенията не съдържат дублиращи се кортежи. Това е причината за SELECT DISTINCT в първата подзаявка. Различният избор, приложен стратегически другаде в заявката, може да я направи по-ефективна, но няма да промени резултата.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java - точното значение http.maxConnections

  2. ora-06553 pls-306 грешен номер или типове аргументи при извикване на 'ogc_x'

  3. Реконструиране на Standby DB

  4. Разбор на tnsnames.ora във Visual C# 2008

  5. Как да превърнем 2 заявки с общи колони (A, B) и (A, C) само в една (A, B, C)?