2017-02-13 75 views
-2

我正試圖在oracle中編寫查詢,並且我無法將表連接在一起。所以我有兩張桌子,其中一張顯示一位特定名人出演的電影,另一張顯示名人關係。我必須找到湯姆克魯斯與他(或曾經)關係過的名人共同出演的電影。所以我必須加入starredin表和關係表。下面是我有:在SQL中不存在表錯誤

SELECT S2.CELEB2 AS Costar, 
S1.MOVIE 
FROM S1.StarredIn, 
S2.StarredIn, 
Relationships 
WHERE S1.CELEB = Relationships.CELEB1 
AND S2.CELEB = Relationships.CELEB2 
AND S1.CELEB = 'Tom Cruise'; 

每次我運行此我得到的說表或視圖不存在,除了我已經創建了兩個名爲StarredIn一張桌子和一臺被稱爲關係的錯誤,我知道我沒有錯 - 在創建過程中拼寫表名。那麼,爲什麼我一直在收到這個錯誤呢?

這裏的語句來創建表:

CREATE TABLE Relationships (
    celeb1 VARCHAR(30), 
    celeb2 VARCHAR(30), 
    started VARCHAR(15), 
    ended VARCHAR(15) 
); 

CREATE TABLE StarredIn (
    celeb VARCHAR(30), 
    movie VARCHAR(100) 
); 

然後,我有一堆的INSERT語句。

+0

請顯示您的表名和字段。 – GolezTrol

+0

好吧,我更新了我的問題。 –

回答

2

如果這是你的意圖「S1」的別名申請表「StarredIn」它應該看起來更像是這樣的:

From StarredIn S1, StarredIn S2, Relationships 
+0

它仍然說表或視圖不存在。我更新了我的問題以顯示如何創建表。 –

0

我想有一個與你是如何給別名的問題表。給了別名

正確格式爲

TABLE_NAME ALIAS_NAME。

請嘗試運行以下查詢。

SELECT Relationships.CELEB2 AS Costar, 
S1.MOVIE 
FROM StarredIn S1, StarredIn S2 , 
Relationships 
WHERE S1.CELEB = Relationships.CELEB1 
AND S2.CELEB = Relationships.CELEB2 
AND S1.CELEB = 'Tom Cruise'; 
+0

我也更新了我的問題,它顯示了表格是如何創建的。 –

+0

感謝您更新您的問題。這真的很有幫助。請確認在使用正確的語法爲表名稱提供別名後仍然出現錯誤。 – Tajinder

+0

好的,如果我使用你的代碼,然後我得到一個錯誤,說命令沒有正確結束。 –

0

S1.StarredIn意味着有一個在架構S1命名爲StarredIn表。但你實際上只想給該表一個別名,即StarredIn S1

此外,您正在使用過時的連接語法,在1992年使其成爲冗餘。請改用顯式的ANSI連接。

然後你的數據庫設計或你的訪問是奇怪的。 StarredIn包含他們出演的演員和電影。Relationships涉及兩名演員。但是,您可以使用此關係來關聯兩個StarredIn記錄。所以即使湯姆克魯斯和凱蒂赫爾姆斯是相關的,湯姆克魯斯扮演的是頂尖槍,這並不意味着凱蒂赫爾姆斯與這部電影合演。你在查詢中似乎做出了錯誤的假設。

因爲你不需要再次加入StarredIn表,因爲演員的名字已經在Relationships表中了。

查詢可適當寫成:

select r.celeb2 as costar, s1.movie 
from starredin s1 
join relationships r on r.celeb1 = s1.celeb 
where s1.celeb = 'Tom Cruise'; 

但提到的結果可能不是你所期待的。

我想你想自己加入StarredIn,不管Relationships,以便找到相同電影中的其他演員。

select s2.celeb as costar, s1.movie 
from starredin s1 
join starredin s2 on s2.movie = s1.movie and s2.celeb <> s1.celeb 
where s1.celeb = 'Tom Cruise' 
order by s1.movie;