ORA-00904 适用于一个 INNER JOIN 但不适用于另一个

时间:2021-05-10 06:30:35

标签: sql oracle inner-join ora-00904

对于我写的一个特定查询,发生了 ORA-00904 错误

SELECT '103040698' as StudID, M.Title, R.SHORTDESC, C.COLOURNAME
FROM MOVIE0698 M
INNER JOIN RATING0698 R
ON M.SHORTDESC = R.SHORTDESC
INNER JOIN COLOURTYPE0698 C
ON M.COLOURNAME = C.COLOURNAME
ORDER BY Title ASC;

专门用于 ON **M.**SHORTDESC = R.SHORTDESC

但是,我之前刚刚编写的前一个查询也使用了 INNER JOIN

SELECT '103040698' as StudID, A.FullName, M.Title, M.RelYear
FROM CASTING0698 C
INNER JOIN ACTOR0698 A
ON C.ActorNo = A.ActorNo
INNER JOIN MOVIE0698 M
ON C.MovieNo = M.MovieNo
ORDER BY RelYear DESC;

这个查询运行完美,所以我不清楚我做错了什么。

据我所知,INNER JOIN 先是用子表写的,然后是父表,例如ON C.ActorNo = A.ActorNo 但我可能是错的,因为我知道有些软件会接受任何一种方式,而其他软件对此很敏感。

对于上下文,我在学校作业中使用 SQLJunior

这是整个错误

<块引用>

ON M.shortdesc = R.shortdesc

*

第 4 行错误:ORA-00904: "M"."SHORTDESC": 无效标识符

2 个答案:

答案 0 :(得分:1)

简单来说,错误消息的意思是“MOVIES0698 表没有名为 SHORTDESC 的列”

请记住,Oracle 列名只有在没有用引号引起来或被全大写引用时才不区分大小写。如果列名用引号括起来,并且不是全部大写,则在创建时必须强制使用引号引用更多

SHORTDESC -- not case sensitive, you could write SELECT shortDesc 
"SHORTDESC" -- not case sensitive, because it's all caps anyway, can write SELECT shortdesc
"ShortDesc" -- case sens, must refer to this column using quotes forever more: SELECT "ShortDesc"... JOIN ON M."ShortDesc" etc

总而言之,无论出于何种原因,都不要将 oracle 列名括在引号中。如果您想将列称为保留字,请称为其他名称

如果电影没有这样的列,您必须在不同的列上加入(SHORTDESC 似乎是一个文本列,无论如何这可能会使加入目标不佳;是否没有其他列旨在将电影和收视率更好?例如收视率表中的“电影”?在我看来,一部电影可能有一个或多个评分(一些评论家认为它很高,其他人认为它很低,并且您将许多评级的分数平均......?)< /p>

答案 1 :(得分:0)

我使用错误的列名将这些表连接在一起,我将其写为

SELECT '103040698' as StudID, M.Title, R.SHORTDESC, C.COLOURNAME
FROM MOVIE0698 M
INNER JOIN RATING0698 R
ON M.SHORTDESC = R.SHORTDESC
INNER JOIN COLOURTYPE0698 C
ON M.COLOURNAME = C.COLOURNAME
ORDER BY Title ASC;

代替

SELECT '103040698' as StudID, M.Title, R.SHORTDESC, C.COLOURNAME
FROM MOVIE0698 M
INNER JOIN RATING0698 R
ON M.ratingcode= R.ratingcode
INNER JOIN COLOURTYPE0698 C
ON M.colourcode= C.colourcode
ORDER BY Title ASC;

TL:DR 我必须为 INNER JOIN 使用正确的外键/主键

相关问题