【问题标题】:ORA-00904 for one INNER JOIN but not for anotherORA-00904 对于一个 INNER JOIN 但不是另一个
【发布时间】:2021-07-31 13:55:28
【问题描述】:

对于一个特定的查询,我写了 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 来完成我的学业

这是整个错误

开 M.shortdesc = R.shortdesc

*

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

【问题讨论】:

  • 连接中表的顺序无关紧要。您只是在链接两个表;两者都不是“父母”或“孩子”。我看不出这有什么问题。您是否检查过文件中的奇怪字符,例如制表符或其他控制字符?你能发布整个错误吗?
  • @TimRoberts 我刚刚添加了整个错误消息,但我想问题在于我编写的查询较少,而更多的是创建表/插入数据文件?
  • 也许我有点厚,但您完美运行的查询不包含任何名为 SHORTDESC 的列。您确定列拼写正确并在正确的表格中引用吗?电影表 M 真的有 SHORTDESC 吗?
  • 一些早期版本的 oracle 对 ON 的编写方式很敏感,但那应该是 30 年前的事情了
  • @CaiusJard 我很确定我有,在我的文本文件的创建表部分我有大写的表名称,但在“插入”部分中,名称都是小写或者名称的开头是大写的,例如短描述与全名

标签: sql oracle inner-join ora-00904


【解决方案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 似乎是一个文本列,无论如何这可能会导致较差的加入目标;是否没有其他列旨在将电影和收视率更好?例如收视率表中的“movieid”?在我看来,一部电影可以有一个或多个收视率(一些评论家对它的评价很高,另一些评价很低,而你平均了许多评分的分数..?)

【讨论】:

    【解决方案2】:

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

    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 使用正确的外键/主键

    【讨论】:

    • 这就是为什么minimal reproducible example 在代码问题中是必须的。但无论如何(正如显然可以预料的那样)——这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息以及您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to AskHelp center 和投票箭头鼠标悬停文本。 PS请在发布前查看您帖子的格式化版本。
    • 内连接不在键上,它们在条件上。为了查询,约束不需要保持、知道或声明。查询由基表和所需结果的行成员条件确定。约束是告诉 DBMS 不允许无效的 DB 状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多