【问题标题】:Columns alias required while creating view - why?创建视图时需要列别名 - 为什么?
【发布时间】:2019-05-24 20:25:40
【问题描述】:

今天,当我创建视图时,我遇到了 oracle 中最愚蠢的错误之一。言归正传,我尝试执行这个简单的查询:

CREATE VIEW dept_agg AS 
SELECT department_id, MIN(salary), MAX(salary)
FROM employees
GROUP BY department_id;

但我收到错误消息:

ORA-00998: 必须使用列别名命名此表达式 00998. 00000 - “必须用列别名命名这个表达式”

谁能解释一下为什么 Oracle 在上述查询中如此需要列别名?特别是当我不创建视图而只运行 select 语句时不需要该别名?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    您正在创建一个视图,而该视图需要为列命名,就像表一样。这通常使用别名来完成:

    CREATE VIEW dept_agg AS    
        SELECT department_id, MIN(salary) as min_salary, MAX(salary) as max_salary
        FROM employees
        GROUP BY department_id;
    

    您还可以将名称作为视图本身的一部分:

    CREATE VIEW dept_agg(department_id, min_salary, max_salary) AS    
        SELECT department_id, MIN(salary), MAX(salary)
        FROM employees
        GROUP BY department_id;
    

    【讨论】:

    • 我的意思是我不明白为什么来自选择的默认列名对于视图来说是不够的,它的列名,比如 - Department_id, Min(salary), Max (工资)?
    • 不过还是谢谢你,因为你告诉我应该怎么做,还有两种方法
    • @J.Doe 。 . .将默认列名视为为最终呈现给用户而添加的内容,而不是数据库实际知道的内容。
    【解决方案2】:

    你可能很好奇,如果你运行它,它就可以工作

    SELECT department_id, MIN(salary), MAX(salary)
    FROM employees
    

    但作为观点的一部分,这是一个问题。这是因为您的查询窗口,无论它是什么,都只是显示您为该字段输入的内容。这就像动态名称,不存储到数据库中。但是要存储定义,oracle有规则

    不带引号的标识符只能包含数据库字符集中的字母数字字符以及下划线 (_)、美元符号 ($) 和井号 (#)

    因此,您需要为动态列提供合法别名。 @Gordon 解释了如何做到这一点......在他的回答中

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2014-06-18
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多