[英]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.