0

Ich lerne gerade, SQL-Abfragen in relationale Algebra zu übersetzen und umgekehrt.SQL in relationale Algebra übersetzen

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) 

Ich möchte Kunden finden, die in Fairfax leben, einen Kredit haben, aber kein Bankkonto haben.

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) 

Macht das Sinn?

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

+0

macht nicht viel Sinn für mich .. möchten Sie etwas konkreter fragen? ich sehe keine sql, zu oder von und übersetzt zu werden, und selbst wenn ich nichts über relationale Algebra weiß, glaube ich nicht, dass das 'customer_name = 'Fairfax'' Sie Kunden finden würde, die dort leben. – Aprillion

+0

Auswahl (σ) wird ständig verwendet. Sie müssen die SQL-Abfragen nicht sehen, um rationale Algebra zu verstehen. Aus der Beschreibung sollte ersichtlich sein –

+0

haha ​​ich meinte customer_city. Mein Fehler... –

Antwort

0

Hier mein Versuch ist mit Standard-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; 

Dies wird jedoch nur funktionieren, wenn die LoanOwners und AccountHolders Tabellen die gleiche haben Anzahl der Attribute mit dem gleichen Namen. Dies ist wahrscheinlich nicht der Fall, daher müssen Sie (SELECT) nur die erforderlichen Attribute projizieren, z.

SELECT customer_name 
    FROM LoanOwners 
EXCEPT DISTINCT 
SELECT customer_name 
    FROM AccountHolders;