2013-10-21 70 views
2

說,有以下兩個表:SQL到關係代數 - 一個特定的情況下

Table1 (PK1, Attr1) 
Table2 (PK2, Attr1) 

的SQL語句:

SELECT * 
FROM Table1,Table2 

結果

(PK1,Table1.Attr1 ,PK2,Table2.Attr1)。

而且我不明白爲什麼,因爲下面的語義查詢:

Table1 x Table2 

和笛卡爾積的定義。

我也想知道關係代數的等價表達式,如果有的話。

這不是家庭作業,我沒有成功地擡起頭,我事先感謝誰會回答我。

+0

交叉連接將一個表中的所有數據與第二個表中的所有數據相關聯。這裏的例子只是簡單地顯示1x1 = 1。如果表1有行a和行b,表2有行c和行d,則會得到4行ac,ad,bc,bd。 (只是我還是這個線程格式化?)。 – Twelfth

+0

對不起,我沒有解釋清楚。我只寫了表格屬性的名稱:PK1,Attr1和PK2是「列」 – user2302585

+0

我忘了謝謝你的回覆。 – user2302585

回答

1

「的SQL語句: SELECT * FROM 表1,表2

結果

(PK1,Table1.Attr1,PK2,Table2.Attr1)」

不正確。這SQL語句的結果[與標題表]

(PK1,ATTR1,PK2,ATTR1)

注意區別小心。在SQL中,那些點限定符以及它們之前的內容是不是結果中屬性/列名稱的一部分。它們是所謂的範圍變量的名稱,並且這些變量僅在其出現的SELECT語句內存在。一旦SELECT語句被「終止」,那些範圍變量消失。您可以通過嘗試來驗證/驗證

SELECT Table1.Attr1 FROM(your join here);

任何符合標準的引擎都會引發錯誤。有些引擎可能會接受這些東西,因爲作者認爲這樣做是適當的,但是您應該認識到,您不能指望任何隨機引擎的行爲如此。

您也可以嘗試

SELECT Attr1 FROM(your join here);

但現在每個引擎都應該抱怨模棱兩可的列引用。

所以我們回來:該SQL語句的結果[與標題表]

(PK1,ATTR1,PK2,attR1位)。

這絕對不是一個關係,因此沒有可能產生這個東西的關係代數的操作,因此根本就不存在任何等價於你的SQL操作的關係代數公式。

+0

這就是我一直在尋找的。非常感謝你! – user2302585