【问题标题】:ORA-00918:column ambiguously defined on inner joinORA-00918: 列在内部连接中定义不明确
【发布时间】:2016-07-31 02:08:21
【问题描述】:

尝试使用内部连接创建视图时不断收到错误:

    CREATE OR REPLACE VIEW lab3view3
AS
SELECT 
       f.firstname,
       f.lastname,
       s.firstname,
       s.lastname,
       c.coursename, 
       sec.days, 
       TO_CHAR (sec.starttime, 'MM/DD/YYYY') AS startdate,
       TO_CHAR(sec.starttime, 'HH:MI AM    ') AS starttime,
       TO_CHAR(sec.endtime, 'MM/DD/YYYY') AS enddate, 
       TO_CHAR(sec.endtime, 'HH:MI AM    ') AS endtime,
       sec.sectionid,
       l.building, 
       l.room,
       g.grade
FROM  section sec
        INNER JOIN grade g
                    ON g.sectionid = sec.sectionid
        INNER JOIN course c
                    ON c.courseid = sec.courseid
        INNER JOIN location l
                    ON l.locationid = sec.locationid
        INNER JOIN student s
                    ON s.studentid = g.studentid
        INNER JOIN instructor i
                    ON i.sectionid = sec.sectionid
        INNER JOIN faculty f
                    ON f.facultyid = i.facultyid
        INNER JOIN section sec
                    ON sec.sectionid = g.sectionid; 

不断收到此错误:

第 1 行出错;

ORA-00918:列定义不明确

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您还需要在TO_CHARstarttimeendtime)调用中使用正确的表格作为时间前缀。您还从不同的表中选择了两次firstnamelastname第二个将被重命名为firstname_1 然后,它们必须重命名,因为您正在创建一个视图,请参阅@sstan's回答。

    【讨论】:

    • 感谢您的输入,我更新了数据,但仍然收到“列不明确定义”错误...
    • 你找到什么了吗?这些都是表格还是您从视图中选择的一些“东西”?也许其中一个视图有错误或必须重新编译。如果某些内容由于某种原因变得无效,则错误消息在 oracle 中可能会非常容易误导。
    • 不幸的是,我还没有到任何地方。选择的所有内容都来自表格,并且可以毫无问题地运行我的其他视图。我将所有内容都注释掉了: SELECT sec.days FROM section sec INNER JOIN section sec ON sec.sectionid = g.sectionid 现在我收到一个错误,上面写着“缺少表达式”
    • 搞清楚了!我的注册表和讲师表之间的 sectionID 没有任何重叠。一旦我更新了该数据,它就可以正常工作了!感谢您的帮助
    【解决方案2】:

    @maraca 的回答是正确的。但是一旦你修复了定义不明确的列错误,你就会得到

    ORA-00957:列名重复

    创建视图时,每个选定的列都需要有一个唯一的名称。确保在 select 子句中为重复的列名设置别名。

    例子:

    CREATE OR REPLACE VIEW lab3view3
        AS
        SELECT faculty.firstname as faculty_firstname,
               faculty.lastname as faculty_lastname,
               student.firstname as student_firstname,
               student.lastname as student_lastname,
    ...
    

    【讨论】:

    • 感谢您的输入,我更新了我的数据以遵循您的建议(以上更新),但仍然遇到同样的错误
    • 那是因为您没有应用@maraca 的答案。您需要修复to_char(<table_name>.starttime, ... 等...以使用表名限定列名。我们只能假设starttimeendtime 存在于多个表中,因此您需要更明确地确定您想要哪一个。
    • 我在以前的视图中使用的 to_char 语句按原样没有错误...我之前使用了一个 select 语句来格式化它们。我再次编辑了我的帖子,并进行了更多更正,以确保没有相同的列名,但不断收到“列不明确定义”错误...
    • tbh,我不明白你是如何得到这个错误的。如果我是你,我会慢慢减少查询,直到我能够找出问题的原因。如果您需要帮助,您必须发布一个最小但完整的脚本,以便我们重现您的问题。
    • 是的,我也看不出任何原因,非常令人沮丧!会听取您的建议,看看我是否能找到问题所在。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多