繁体   English   中英

需要一些帮助来创建视图定义

[英]Need some assistance in creating a view definition

我试图创建一个视图,如下所示:

CREATE VIEW TEMP_VIEW AS
SELECT
   a.actor_id,
   a.first_name,
   a.last_name,
   LISTAGG(DISTINCT(c.name ) || ': ' ||
        (SELECT LISTAGG(f.title,', ') WITHIN GROUP (ORDER BY f.title)
                    FROM film f
                    INNER JOIN film_category fc
                      ON f.film_id = fc.film_id
                    INNER JOIN film_actor fa
                      ON f.film_id = fa.film_id
                    WHERE fc.category_id = c.category_id
                    AND fa.actor_id = a.actor_id
                 )
             ,'; ') WITHIN GROUP (ORDER BY c.name) AS film_info
FROM actor a
LEFT JOIN film_actor fa ON a.actor_id = fa.actor_id
LEFT JOIN film_category fc ON fa.film_id = fc.film_id
LEFT JOIN category c ON fc.category_id = c.category_id
GROUP BY a.actor_id, a.first_name, a.last_name;

我得到的错误是:

LISTAGG(DISTINCT(c.name)||':'||
*
第5行出现错误:
ORA-30482:此功能不允许使用DISTINCT选项

视图的查询输出应类似于:

actor_id   | 1
first_name | PENELOPE
last_name  | GUINESS
film_info  | Animation: ANACONDA CONFESSIONS; Children: LANGUAGE COWBOY; Classics: COLOR PHILADELPHIA, WESTWARD SEABISCUIT; Comedy: VERTIGO NORTHWEST; Documentary: ACADEMY DINOSAUR; Family: KING EVOLUTION, SPLASH GUMP; Foreign: MULHOLLAND BEAST; Games: BULWORTH COMMANDMENTS, HUMAN GRAFFITI; Horror: ELEPHANT TROJAN, LADY STAGE, RULES HUMAN; Music: WIZARD COLDBLOODED; New: ANGELS LIFE, OKLAHOMA JUMANJI; Sci-Fi: CHEAPER CLYDE; Sports: GLEAMING JAWBREAKER

No.1-错误消息很清楚,您不能在LISTAGG中使用DISTINCT函数。

2-在规范化的数据结构中,类别名称将始终是唯一的

自己尝试检查一下:

SELECT COUNT(DISTINCT(name)) FROM category;
SELECT COUNT(*) FROM category;

如果您的架构已正确规范化,则两个查询的结果将相同,如果这样,请从视图定义中删除单词DISTINCT。

其余的看起来不错。

我会用嵌套选择来做到这一点。 我认为以下是您想要的:

SELECT actor_id, first_name, last_name,
       LISTAGG(category || ': ' || films, '; ') WITHIN GROUP (ORDER BY category)
FROM (SELECT a.actor_id, a.first_name, a.last_name, c.name as category
             LISTAGG(f.title, ', ') WITHIN GROUP (ORDER BY f.title) as films
      FROM actor a LEFT JOIN
           film_actor fa
           ON a.actor_id = fa.actor_id LEFT JOIN
           file f
           on fa.film_id = f.film_id LEFT JOIN
           film_category fc
           ON fa.film_id = fc.film_id LEFT JOIN
           category c
           ON fc.category_id = c.category_id
      GROUP BY a.actor_id, a.first_name, a.last_name, c.name
     ) t
GROUP BY actor_id, first_name, last_name;

我会先选择不同的记录,然后使用listagg函数。 像这样

create table test1 ( col1 number, col2 number);

insert into test1 values (1,2);
insert into test1 values (1,2);
insert into test1 values (1,2);
insert into test1 values (2,3);
insert into test1 values (2,3);
insert into test1 values (3,4);
commit;


select LISTAGG(col1, ',') within group ( order by col2) as str
from (select distinct col1,col2 from test1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM