首页 > 解决方案 > 试图从另一个视图创建一个视图?甲骨文顶点

问题描述

我有一个任务,我一直在尝试解决,但我做不到

第一个问题是“1. 创建一个视图 VE1,它将 customer_id、cust_title 和每个客户的总金额。” 所以我创建了第一个视图

 CREATE OR REPLACE FORCE VIEW "VE_1" ("CUST_ID", "CUST_TITLE", "TOTAL_AMOUNT") AS 
  SELECT Customer.cust_id,customer.cust_title,
SUM(lead.amount) AS Total_amount
FROM customer,lead
WHERE customer.cust_id=lead.cust_id
GROUP BY customer.cust_id,customer.cust_title
ORDER BY customer.cust_id
/

所以在我创建了视图一之后(我不确定它是否是正确的答案)。这个问题二是我发布这个问题的主要原因“您想要与 1 中相同的组结果,但仅适用于总金额超过 25,000(HAVING)的客户。您可以使用来自 VE1 的连续视图 VE2 来做到这一点,如果不是为什么?如果不能像新视图 VE3 一样连续执行它。所以我尝试了这段代码

CREATE OR REPLACE FORCE VIEW "VE_2" ("CUST_ID", "CUST_TITLE", "TOTAL_AMOUNT") AS 
  SELECT VE_1.cust_id,VE_1.cust_title,
SUM(lead.amount) AS Total_amount
FROM VE_2
WHERE customer.cust_id=lead.cust_id
GROUP BY customer.cust_id,customer.cust_title
HAVING
    count( amount ) > 25000
ORDER BY customer.cust_id
/

它说“编译失败,第 0 行(17:14:40)ORA-01731:遇到圆形视图定义”

请帮忙!

标签: sqloraclevieworacle-apex-5.1

解决方案


您收到错误消息,因为您正试图从即将创建的视图中进行选择。此外,您指customer的是子句lead中未介绍的和。FROM所以那也一定会失败。

您几乎可以将所有语句重复用于第一个视图以获得第二个视图。只需添加一个HAVING子句。

CREATE
 OR REPLACE VIEW ve_2
                 (cust_id,
                  cust_title,
                  total_amount)
AS
SELECT customer.cust_id,
       customer.cust_title,
       sum(lead.amount) AS total_amount
       FROM customer
            INNER JOIN lead
                       ON customer.cust_id = lead.cust_id
       GROUP BY customer.cust_id,
                customer.cust_title
       HAVING sum(lead.amount) > 25000;

您还可以使用第一个视图创建第二个视图。但是HAVING在这里您需要使用WHERE子句而不是子句,因为数据已经聚合。

CREATE
 OR REPLACE VIEW ve_2
                 (cust_id,
                  cust_title,
                  total_amount)
AS
SELECT ve_1.cust_id,
       ve_1.cust_title,
       ve_1.total_amount
       FROM ve_1
       WHERE ve_1.total_amount > 25000;

推荐阅读