SQL中不存在表错误

时间:2017-02-13 21:05:25

标签: sql oracle

我正在尝试在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)
);

然后我有一堆插入语句。

3 个答案:

答案 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';

但如上所述,结果可能不是您要找的。

我想你想要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;