我正在尝试在oracle中编写查询,而我在将表连接在一起时遇到了麻烦。所以我有两张桌子,其中一张显示特定名人出演的电影,另一张显示名人关系。我必须找到汤姆克鲁斯与他正在(或曾经)关系过的名人共同主演的电影。所以我必须加入starredin表和关系表。这就是我所拥有的:
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的表和一个名为Relationships的表,我知道在创建过程中我并没有错误拼写表名。那么为什么我一直都会收到这个错误?
以下是创建表的语句:
CREATE TABLE Relationships (
celeb1 VARCHAR(30),
celeb2 VARCHAR(30),
started VARCHAR(15),
ended VARCHAR(15)
);
CREATE TABLE StarredIn (
celeb VARCHAR(30),
movie VARCHAR(100)
);
然后我有一堆插入语句。
答案 0 :(得分:2)
如果您打算将'S1'的别名应用于表'StarredIn',它应该看起来更像这样:
From StarredIn S1, StarredIn S2, Relationships
答案 1 :(得分: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';
答案 2 :(得分:0)
S1.StarredIn
表示架构StarredIn
中有一个名为S1
的表。但实际上,您只想为表格提供StarredIn S1
的别名。
此外,您使用的是1992年冗余的过时连接语法。请使用显式ANSI连接。
然后您的数据库设计或对它的访问很奇怪。 StarredIn
包含他们主演的演员和电影。Relationships
涉及两个演员。但是,您可以使用此关系来关联两个StarredIn
记录。因此,即使汤姆克鲁斯和凯蒂霍姆斯有关系并且汤姆克鲁斯参加了Top Gun,这并不意味着凯蒂霍尔姆斯联合出演了那部电影。您似乎在查询中做出了错误的假设。
原样,您不需要再次加入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';
但如上所述,结果可能不是您要找的。 p>
我想你想要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;