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;

ただし、これが機能するのは、LoanOwnersおよびAccountHoldersテーブルに、それぞれ同じ名前の同じ数の属性がある場合のみです。これが当てはまる可能性は低いためSELECT、必要な属性のみを射影 ( ) する必要があります。

SELECT customer_name
  FROM LoanOwners
EXCEPT DISTINCT
SELECT customer_name
  FROM AccountHolders;
于 2012-03-29T07:15:40.767 に答える