Sql &引用;ORA-00998:必须使用列别名命名此表达式;我犯了这个错误,谁能告诉我是什么';问题和解决办法是什么

Sql &引用;ORA-00998:必须使用列别名命名此表达式;我犯了这个错误,谁能告诉我是什么';问题和解决办法是什么,sql,oracle,Sql,Oracle,这是我的示例代码- CREATE TABLE orders ( ord_no int, purch_amt float, ord_date varchar(50), customer_id int, salesman_id int, PRIMARY KEY(ord_no) ); INSERT INTO orders (ord_no, purch_amt, ord_date, customer_id, salesman_id) VALUES (70001, 150.5, '2012-10-05

这是我的示例代码-

CREATE TABLE orders
(

ord_no int,
purch_amt float,
ord_date varchar(50),
customer_id int,
salesman_id int,
PRIMARY KEY(ord_no)
);

INSERT INTO orders (ord_no, purch_amt, ord_date, customer_id, salesman_id)
VALUES (70001, 150.5, '2012-10-05', 3005, 5002);

CREATE VIEW totalforday 
 AS SELECT ord_date , COUNT(DISTINCT customer_id),
 AVG(purch_amt), SUM(purch_amt)
 FROM orders
 GROUP BY ord_date;

想象一下为新视图编写一个查询

SELECT ord_date,
       COUNT(DISTINCT customer_id),
       AVG(purch_amt),
       SUM(purch_amt)
 FROM totalforday;
您的列名-您是在要求一个名为SUM(purch_amt)的列,还是在尝试对一个名为purch_amt的列进行求和

您需要隐式或显式地为视图提供有效的列名。添加别名允许数据库隐式地确定列的名称

像这样

CREATE or replace VIEW totalforday 
 AS SELECT ord_date , COUNT(DISTINCT customer_id) how_many_customers,
 AVG(purch_amt) avg_amt, SUM(purch_amt) total_amt
 FROM orders
 GROUP BY ord_date;
说:

如果省略[view]别名,则数据库将从查询中的列或列别名中派生它们。因此,如果查询包含表达式而不是列名,则必须使用别名

因此,如果视图定义不包含视图本身的列/别名列表,则必须在查询中提供它们,如@Jeff所示:

CREATE OR REPLACE VIEW totalforday
AS
SELECT ord_date,
  COUNT(DISTINCT customer_id) AS count_customers,
  AVG(purch_amt) AS avg_purch_amt,
  SUM(purch_amt) AS sum_purch_amt
FROM orders
GROUP BY ord_date;

describe totalforday

Name            Null? Type   
--------------- ----- ------ 
ORD_DATE              DATE   
COUNT_CUSTOMERS       NUMBER 
AVG_PURCH_AMT         NUMBER 
SUM_PURCH_AMT         NUMBER 
另一种方法是显式指定视图的列名:

CREATE OR REPLACE VIEW totalforday
  (ord_date, count_customers, avg_purch_amt, sum_purch_amt)
AS
SELECT ord_date,
  COUNT(DISTINCT customer_id),
  AVG(purch_amt),
  SUM(purch_amt)
FROM orders
GROUP BY ord_date;

describe totalforday

Name            Null? Type   
--------------- ----- ------ 
ORD_DATE              DATE   
COUNT_CUSTOMERS       NUMBER 
AVG_PURCH_AMT         NUMBER 
SUM_PURCH_AMT         NUMBER 
查询仍然可以包含列和列表达式的别名,如果您希望独立运行该查询,这会很有帮助,但视图会忽略这些别名-仍然使用显式名称/别名:

CREATE OR REPLACE VIEW totalforday
  (ord_date, count_customers, avg_purch_amt, sum_purch_amt)
AS
SELECT ord_date AS ignored_1,
  COUNT(DISTINCT customer_id) AS ignored_2,
  AVG(purch_amt) AS ignored_3,
  SUM(purch_amt) AS ignored_4
FROM orders
GROUP BY ord_date;

describe totalforday

Name            Null? Type   
--------------- ----- ------ 
ORD_DATE              DATE   
COUNT_CUSTOMERS       NUMBER 
AVG_PURCH_AMT         NUMBER 
SUM_PURCH_AMT         NUMBER 

来自MySQL的Oracle错误。。。将标记替换为。您必须在“创建”视图中命名“选择”列。例如,
COUNT(DISTINCT customer\u id)cust\u cnt
。这是Oracle更清晰的错误消息之一*8-)它在工作,但我怀疑,每当我必须创建视图时,是否有必要进行此计数(DISTINCT customer\u id)多少客户,平均(purch\u amt)平均金额,总和(purch\u amt)总计这是一个完全不同的问题,为了帮助您做到这一点,我们需要更多地了解您正在构建的视图需求背后的业务需求