【发布时间】:2015-04-15 18:56:28
【问题描述】:
我知道对于具有超过 1 级深度的引用父级的嵌套查询的 oracle 限制要求我们展示一些创造力,但我真的坚持这一点。
我需要通过选择包含电视节目的名为“PROGRAM”的表的字段并在视图中包含一个名为“PRODUCERS”的字段来创建一个视图,该字段必须是电视节目中涉及的所有制作人的串联。
因此,我最终在视图创建过程中处理了 3 个表:
节目(id_program,导演,...)
PRODUCER (id_producer, name, ...)
PROGRAM_PRODUCER (id_producer, id_program)
这是创建视图的查询:
DROP VIEW VIEW_PROGRAM;
CREATE OR REPLACE FORCE VIEW VIEW_PROGRAM
(
PRGM_ID,
FORMAT_TITLE,
GENRE,
TYPE,
DIRECTOR,
ORIGIN1,
PRODUCER,
BROADCAST_TIME,
DURATION,
CHANNEL,
LOCAL_TITLE
)
AS
SELECT program.id_program AS prgm_id,
program.original_title AS format_title,
genres.genre AS genre,
genres.type_ AS TYPE,
program.director AS director,
program.origin1,
(Select listagg(producer,' / ') WITHIN GROUP (order by 'producer')
FROM (SELECT P.PRODUCER FROM PRODUCERS P WHERE P.ID IN
(SELECT PP.ID_PRODUCER FROM PROGRAM_PRODUCER PP WHERE PP.ID_PROGRAM = 19927))) AS producer,
program.broadcast_time AS broadcast_time,
program.duration AS duration,
channels.channel AS channel,
program.local_title
FROM program
LEFT JOIN genres
ON program.p_genre = genres.id_genre
LEFT JOIN countries
ON program.p_country = countries.id_country
LEFT JOIN channels
ON program.p_channel = channels.id_channel;
我的问题在于这部分:
(Select listagg(producer,' / ') WITHIN GROUP (order by 'producer')
FROM (SELECT P.PRODUCER FROM PRODUCERS P WHERE P.ID IN
(SELECT PP.ID_PRODUCER FROM PROGRAM_PRODUCER PP WHERE PP.ID_PROGRAM = 19927))) AS producer,
除了值“19927”实际上应该引用“prgm_id”,但这显然会抛出未知标识符异常..
我花了很多时间尝试将 where 子句拉到其他地方,但没有成功,非常感谢任何帮助。
【问题讨论】:
-
您为什么在该部分使用
IN和另一个子查询,而不是将producers加入program_producer?为什么要按常数而不是列值排序-我想这只是一个错误?我不确定你为什么有一个子查询,并且没有加入主查询中的第四个表并使用group by子句.... -
无论我使用 join 还是 in 子句,它都不会改变我的 listagg 函数需要嵌套查询的事实,因此在引用 prgm_id 时会出现同样的问题
-
连接将摆脱一层嵌套;你已经有了一个额外的冗余级别。您可以将其简化为单个子查询,然后可以看到外部查询的列值;或者在主查询中使用额外的连接和 group by 来消除子查询。
-
你说得对,我只是没看到...谢谢!