为什么我的观点不会编译?

时间:2015-12-27 10:24:41

标签: sql oracle ddl sql-view

我想创建一个这样的视图:

create or replace view sales_num as 
Select M.Medicine_name , M.Price , count(S.Sales_number)
from Medicine M Join Sales S
on (M.Code=S.Code)
gorup by M.Code ;

错误报告 -

  

SQL错误:ORA-00933:SQL命令未正确结束   00933. 00000 - “SQL命令未正确结束”   *原因:
  *操作:

有什么问题?即使我将拼写错误gorup更正为group,但它仍无效。

修改

即使在纠正gorup错字错误后仍然存在。

2 个答案:

答案 0 :(得分:1)

有两个问题:

  • 单词group
  • 中存在明显的拼写错误
  • 使用group by时,select列表中的每个元素必须是分组的元素或聚合值,但不能是其他元素。因此, Medicine_name price 的选择都与此要求相冲突。

根据您的期望,这是解决问题的一种方法:

Select M.Code,
       Min(M.Medicine_name) as Medicine_name, 
       Min(M.Price) as Price,
       Count(S.Sales_number)
from   Medicine M
Join   Sales S
    on M.Code = S.Code
group by M.Code;

如果M.Code是唯一标识符,则两个添加的Min()聚合值将只返回预期的 Medicine_name Price 。但这是标准SQL想要它的方式,并且Oracle遵循此规则,如Oracle docs中所述:

  带有GROUP BY子句的 SelectExpression 中的

SelectItems 必须只包含聚合或分组列。

解决此问题的另一种方法是修改group by列表:

Select M.Medicine_name, 
       M.Price,
       Count(S.Sales_number)
from   Medicine M
Join   Sales S
    on M.Code = S.Code
group by M.Medicine_name,
         M.Price;

您也可以拥有多个中间解决方案。

答案 1 :(得分:1)

视图有两个问题:

  1. group by子句必须包含所有非聚合列
  2. 视图中的列必须具有合法的Oracle名称,这意味着您需要为使用函数的任何列提供别名。
  3. 此版本的视图将编译:

    create or replace view sales_num as 
        select m.medicine_name , 
               m.price , 
               count(s.sales_number) tot_sales_number
         from medicine m 
              join sales s on (m.code=s.code)
         group by m.medicine_name,
                m.price;