0

Я просто изучаю, как переводить SQL-запросы в реляционную алгебру и наоборот.Перевод 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) 

Я хочу, чтобы найти клиентов, которые живут в Fairfax, есть кредит, но не имеют счета в банке.

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) 

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

* SELECT: σ, PROJECT: π, NATURAL JOIN: ⋈

+0

не имеет для меня никакого смысла .. вы хотите спросить, что-то более конкретное? я не вижу каких-либо sql для перевода или из и даже если я ничего не знаю о реляционной алгебре, я не думаю, что 'customer_name = 'Fairfax'' найдет вас клиентов, которые там живут .. – Aprillion

+0

Выбор (σ) используется корректно. Вам не нужно видеть запросы sql для определения рациональной алгебры. Это должно быть очевидно из описания –

+0

haha ​​i означает customer_city. Виноват... –

ответ

0

Вот моя попытка с помощью стандартного 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;