Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách biểu diễn phép chia quan hệ (biểu thức đại số cơ bản) trong SQL

Đưa ra DDL này cho các bảng tương ứng với các mối quan hệ có liên quan của bạn:

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

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

Bạn có thể chuyển công thức chia (3) thành cú pháp Oracle SQL khá đơn giản, mặc dù nó dài dòng:

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

Như đã chỉ định, chỉ sử dụng CROSS JOINMINUS các phép toán, để tương ứng trực tiếp với công thức đại số quan hệ. Tuy nhiên, trong một ứng dụng cơ sở dữ liệu thế giới thực, người ta chắc chắn sẽ nhận được cùng một kết quả thông qua một truy vấn hoàn toàn khác.

Cũng lưu ý rằng cơ sở dữ liệu SQL có thể và thực sự vi phạm nguyên tắc của đại số quan hệ chính thức rằng các quan hệ không chứa các bộ giá trị trùng lặp. Đó là lý do cho SELECT DISTINCT trong truy vấn con đầu tiên. Lựa chọn riêng biệt được áp dụng một cách chiến lược ở những nơi khác trong truy vấn có thể làm cho nó hiệu quả hơn, nhưng sẽ không làm thay đổi kết quả.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng hàm MIN trong mệnh đề có

  2. Trả lại hàng có giá trị tối đa của một cột cho mỗi nhóm

  3. Làm cách nào để sử dụng tham số IN OUT CLOB được xác định trong Proc được lưu trữ trong Oracle JDBC?

  4. tìm kiếm toàn bộ cơ sở dữ liệu oracle cho một phần của chuỗi

  5. Phân tích cú pháp chuỗi phân cách bằng đường ống thành cột?