«ORA-00998: должен назвать это выражение псевдонимом столбца» У меня возникла эта ошибка, может кто-нибудь сказать мне, в чем проблема и ее решение - PullRequest
0 голосов
/ 02 апреля 2020

это мой пример кода; -

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;

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Представьте себе, что вы пишете запрос для вашего нового представления.

SELECT ord_date,
       COUNT(DISTINCT customer_id),
       AVG(purch_amt),
       SUM(purch_amt)
 FROM totalforday;

Имена ваших столбцов - вы запрашиваете столбец с именем SUM (purchase_amt) или пытаетесь внести сумму в столбец с именем purchase_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;

enter image description here

1 голос
/ 03 апреля 2020

Документация гласит:

Если вы опустите псевдонимы [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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...