Перевод SQL в реляционную алгебру - PullRequest
0 голосов
/ 28 марта 2012

Я только учусь переводить SQL-запросы в реляционную алгебру и наоборот.

Customer(customer_name, customer_street, customer_city)
Loan(loan_number, branch_name, amount)
Borrower(customer_name, loan_number)
Account(account_number, branch_name, balance)
Depositor(customer_name, account_number)

Я хочу найти клиентов, которые живут в Фэрфаксе, имеют кредит, но НЕ имеют банковского счета.

CustomersInFFX = PROJECT customer_name (SELECT customer_city = 'Fairfax'(Customer))
LoanOwners = (CustomersInFFX NATURAL JOIN Borrower NATURAL JOIN Loan)
AccountHolders = (Depositor NATURAL JOIN ACCOUNT)
PROJECT customer_name (LoanOwners - AccountHolders)

Имеет ли это смысл?

* ВЫБРАТЬ: σ, ПРОЕКТ: π, ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ: ⋈

1 Ответ

0 голосов
/ 29 марта 2012

Вот моя попытка использовать стандартный SQL:

WITH CustomersInFFX 
     AS 
     (
      SELECT *
        FROM Customer
       WHERE customer_city = 'Fairfax'
     ),
     LoanOwners 
     AS
     (
      SELECT * 
        FROM CustomersInFFX 
             NATURAL JOIN Borrower 
             NATURAL JOIN Loan
     ),
     AccountHolders
     AS
     (
      SELECT *
        FROM Depositor 
             NATURAL JOIN ACCOUNT
     )
SELECT *
  FROM LoanOwners
EXCEPT CORRESPONDING DISTINCT
SELECT *
  FROM AccountHolders;

Однако это будет работать только в том случае, если таблицы LoanOwners и AccountHolders имеют одинаковое количество атрибутов, каждое из которых имеет одинаковое имя. Это вряд ли имеет место, поэтому вам нужно будет проецировать (SELECT) только необходимые атрибуты, например

SELECT customer_name
  FROM LoanOwners
EXCEPT DISTINCT
SELECT customer_name
  FROM AccountHolders;
...