2014-02-27 75 views
0

假設我們有這樣的關係模式顯示在關係代數的順序

住房建築商(HID,hName,hStreet,hCity,HZIP,hPhone)

模型(HID,MID,MNAME,平方英尺,故事)

細分(SNAME, sCity,sZip)

提供(SNAME,HID,MID,價格)

很多(SNAME, lotNum,lStAddr,lSize所,lPremium)

出售(SNAME,lotN嗯,HID,MID, 狀態)

我做關係代數針對各個子問題,發現在那個細分提供的模型所提供模型的數量和平均,最低和最高價格。同樣以家庭平均價格降序顯示結果。

我用SQL公式完成了,但是我很難將這個SQL翻譯成關係代數。有人能幫我嗎? 這是我走到這一步:

SQL:= 
    SELECT S, avg (O.price), min (O.price), max (O.price), count(*) 
    FROM offered O, subdivision S 
    WHERE O.sName = S.sName 
    GROUP BY S.sName 
    ORDER BY 4 desc; 
+0

注意,作爲陳述[這裏](http://stackoverflow.com/q/19741059/1607043)和[這裏](http://stackoverflow.com/a/14669231/1607043),你不能這樣做在訂購關係代數。 – DPenner1

回答

1

+1到DPenner的評論:完全正確,你不能做RA訂購。 (儘管那些q和a的引用似乎有一些'困難')。

你不能在RA中執行的另一件事(與JaveLeave顯示的SQL相反)是通過位置引用匿名列。如果SQL是一種合理的語言(或者任何語言),您可以在SELECT子句中命名列...,max(O.price)AS maxPrice,...然後ORDER BY maxPrice desc。但是,不,你不能那樣做。在SQL中,您必須重複ORDER BY max(O.price)desc。 (順便提一下,問題是按平均價格排序,而不是最大值(?),這是第2列。)

對比RA組操作返回關係。作爲一種關係,它必須具有隻能按名稱尋址的屬性。

回到問題中。您可以進行排序的最接近的方法是在每行上放置一列,並在該行的序號位置相對於整個表格。由於問題要求降序,因此第一步是找到平均價格最小的細分,並用順序1標記。然後選擇除那一個以外的所有項目,得到那些項目的最小值,用2來標記它。一般來說:取到目前爲止都沒有標記;得到最小值;使用最高的標記標記+1;遞歸。所以你需要傳遞閉包操作(這是標準RA的另一個「缺失」功能)。你可以在comp.database.theory中找到一些SQL代碼來實現這種事情 - 從Joe Celko的內存中給出的例子。

題外話:我很疑惑爲什麼SQL中的課程/教授/教科書還要求你在RA中做不可能的事情。當然,在RA中接地是很好的。理解SQL僅僅模糊的數據結構是一個強大的心智模型。 RA(作爲代數)支撐大多數SQL引擎。但是爲什麼會留下這樣的印象:RA是SQL的某種「可憐的表兄弟」?沒有RA的商業實現; RA程序員沒有招聘廣告。爲什麼試圖讓它不是什麼?