2013-02-15 103 views
0
  1. 選擇account_no上,金額,客戶從交易,其中分支= 'Pennywell'如何寫這些SQL的關係代數查詢

  2. 選擇c.customer_name,c.cust_street,c.cust_city,B。 branch_name,b.branch_city,a.account_no,a.balance from customer c,transactions t,accounts a,branch b where t.customer = c.customer_name and a.account_no = t.account_no and b.branch_name = a.branch_name

  3. select customer_name,cust_city from customer where customer_name not in(select customer from transactio NS)

回答

0

第一種是隨後在account_no上,量,顧客投影只是Pennywell選擇:

\pi_{account_no, amount, customer} (\sigma_branch = 'Pennywell'(transactions)) 

第二個遵循相同的原則:

  1. 列出所有您的桌子:

客戶,交易,帳戶,分支

  1. 重命名使用\ RHO中的每一個:

\ rho_c(客戶),\ rho_t(事務),\ rho_a(帳戶) , \ rho_b(分支)

  1. 計算笛卡爾乘積

\ rho_c(客戶)X \ rho_t(交易)X \ rho_a(賬戶)X \ rho_b(分公司)

  1. 對結果進行選擇( 「裏」)步驟3更換和通過連接詞,或通過析取,而不是由否定:

\ sigma_ {t.customer = c.customer_name/\ a.account_no = t.account_no/\ b.branch_name =一個。 branch_name}(\ rho_c(custome r)的X \ rho_t(事務)X \ rho_a(帳戶)X \ rho_b(分支))

  1. 最後進行投影:

\ pi_ {c.customer_name,C .cust_street,c.cust_city,b.branch_name,b.branch_city,a.account_no,a.balance}(\ sigma_ {t.customer = c.customer_name/\ a.account_no = t.account_no/\ b.branch_name = a 。branch_name}(\ rho_c(客戶)X \ rho_t(交易)X \ rho_a(賬戶)X \ rho_b(分支)))

最後的查詢是有點棘手,它涉及多一點的思考。

\ pi_ {CUSTOMER_NAME}(交易)

都是我們要忽略客戶和

\ pi_ {CUSTOMER_NAME}(客戶)

是所有客戶。因此,

\ pi_ {CUSTOMER_NAME}(客戶) - \ {pi_ CUSTOMER_NAME}(交易)

都是那些我們想保持。最後,我們需要找到自己的城市(爲簡便起見,我採用加盟經營者| X |):

\ pi_ {CUSTOMER_NAME,cust_city}((\ {pi_ CUSTOMER_NAME}(客戶) - \ pi_ {customer_name}(transactions))| x | customer)

+0

請問什麼意思| x |因爲我不明白 – chidoskychidosky 2013-02-16 02:12:41

+0

| x |是自然連接運算符。來自維基百科:「自然連接的結果是R和S中元組的所有組合的集合,它們的公共屬性名稱相同。」 – 2013-02-16 14:06:10