2012-08-16 88 views
3

表:以上SQL到關係代數

Show(show_id, title, start_date, duration,singer,hall_id) 
Concert(concert_is,date,hour,show_id) 
Hall(Hall_id, name, address, capacity) 

是3代表的DB。我需要一些簡單的SQL statments轉換爲RA:

SELECT date 
FROM Concert C, Show S, Hall H 
WHERE C.show_id = S.Show_id 
AND S.hall_id = H.hall_id 
AND S.singer = 'A' 
AND H.name = 'B' 

在RA:

pi date (s(show_id = show_id)Show |><| Concert) 

上述不完整的,我只需要知道,如果在正確的軌道上的IM。關於RA的信息有限。

回答

1

第一步是將查詢放入單詞中:詢問什麼?在這種情況下,我們需要所有音樂會的日期,其中演唱會的演出由'A'演唱,演唱會的大廳名爲'B'。 (這一步並不總是必要的 - 在很多情況下,我們可能直接從SQL生成RA - 但確保您明白自己在做什麼絕不是一個壞主意)。

因此,讓我們從裏到外構建您的RA聲明。首先,我們希望確保在任何時候我們看同一場演出和音樂會,我們只在該演唱會上尋找演出,在這種情況下,演出的ID是一個音樂會場。所以你使用natural join/|><|的直覺是正確的。我一直都知道,除非另有說明,否則自然連接會自動匹配所有等效列名(儘管我會首先檢查您的教師標準),因此在這種情況下,我們不需要指定連接條件ID的匹配。即使我們這樣做了,那也是連接的下標,而不是選擇語句的一部分。接下來我們要確保當我們看到一個大廳和一個節目時,我們只看那個大廳裏的節目。所以我們想要自然的加入大廳以前的結果(注意加入順序 - 如果還沒有加入演出,你不能自然地加入音樂會和大廳)。

下一步是隻獲取我們想要的信息行。在這種情況下,select/sigma報表非常容易 - 只需指定名稱和大廳必須是你想要的。最後,我們僅從我們檢索的行中獲取我們想要的數據元素 - 在這種情況下,我們只會預測日期。之後,我們完成了。從你的RA到目前爲止,我可以看到你已經擁有了所有的操作符,你只是錯過了操作數!

請注意,還有其他一些事情需要考慮。您可能需要考慮在每張桌上使用rename/rho以簡化書寫工作。此外,如果您的RA需要完全複製SQL,則必須使用重命名,並且用​​替換您的自然聯接,並將聯接條件放入您的select語句中。

1

這裏使用「NATURAL JOIN」對它進行一次性處理。還要注意,我沒有使用你的元組變量:

pi date (sigma name = 'B' AND singer = 'A' (CONCERT x SHOW x HALL)) 

上面的表達式是評估你的SQL查詢效率最低的方法之一;然而,在語法上它更接近你的SQL。

這裏是查詢模板我用:

pi TargetList sigmaSelection_Condition (REL1 x ... X RELn) 

我會盡快與使用一個多種變異更新|> < |運營商,如果你想......

+2

您可能想再看看給出的SQL。在'WHERE'子句中給出了連接條件,你忽略了。另外,在這裏做什麼'學期='F1995'? – Jodaka 2012-09-23 15:15:41