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) 

我想找到住在费尔法克斯的客户,有贷款但没有银行账户。

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) 

这是否有意义?

*选择:σ,项目名称:π,自然连接:⋈

+0

对我没有多大意义..你想问些更具体的思考吗?我没有看到任何SQL被翻译为或来自,即使我不知道任何有关关系代数,我不认为'customer_name ='费尔法克斯'会找到你住在那里的客户.. – Aprillion 2012-03-28 18:41:55

+0

选择(σ)正确使用。你不需要看到sql查询来找出合理的代数。从描述 – 2012-03-28 18:45:05

+0

应该很明显,哈哈我的意思是customer_city。我的错... – 2012-03-28 19:04:42

回答

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; 

但是,如果LoanOwnersAccountHolders表具有相同的这只会工作每个具有相同名称的属性数量。这不太可能是这种情况,因此您需要投影(SELECT)仅需要的属性,例如

SELECT customer_name 
    FROM LoanOwners 
EXCEPT DISTINCT 
SELECT customer_name 
    FROM AccountHolders;