0

我只是在学习如何将 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)

这有意义吗?

*选择:σ,项目:π,自然连接:⋈</p>

4

1 回答 1

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;
于 2012-03-29T07:15:40.767 回答