Oracle嵌套查询引用父列深度超过1级

Oracle嵌套查询引用父列深度超过1级,oracle,nested,subquery,Oracle,Nested,Subquery,我知道oracle对引用父级超过1级的嵌套查询的限制要求我们表现出一些创造性,但我真的很坚持这一点 我需要创建一个视图,方法是选择一个名为“PROGRAM”的表中包含电视节目的字段,并在视图中包含一个名为“PRODUCERS”的字段,该字段必须是电视节目中涉及的所有制片人的串联 因此,在视图创建过程中,我最终要处理3个表: 项目(id_项目、总监等) 制作人(id_制作人,姓名,…) 节目制作人(id制作人,id节目) 以下是创建视图的查询: DROP VIEW VIEW_PROGRAM; C

我知道oracle对引用父级超过1级的嵌套查询的限制要求我们表现出一些创造性,但我真的很坚持这一点

我需要创建一个视图,方法是选择一个名为“PROGRAM”的表中包含电视节目的字段,并在视图中包含一个名为“PRODUCERS”的字段,该字段必须是电视节目中涉及的所有制片人的串联

因此,在视图创建过程中,我最终要处理3个表:

项目(id_项目、总监等)

制作人(id_制作人,姓名,…)

节目制作人(id制作人,id节目)

以下是创建视图的查询:

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子句拉到其他地方,但没有成功,任何帮助都将不胜感激。

您不需要嵌套的子查询;您可以将该部分替换为单个子查询级别中的联接,该子查询仍然可以引用程序:

      (Select listagg(p.producer,' / ') WITHIN GROUP (order by p.producer) 
        FROM PRODUCERS P
        JOIN PROGRAM_PRODUCER PP ON P.ID_PRODUCER = PP.ID_PRODUCER
        WHERE PP.ID_PROGRAM = program.id_program) AS producer,
或者,您可以通过在主外部联接序列中包含额外的表并添加包含所有其他选择列表项的
group by
子句来完全删除子查询:

   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,
          listagg(producers.producer,' / ')
            WITHIN GROUP (order by producers.producer) AS producer,
          program.broadcast_time AS broadcast_time,
          program.duration AS duration,
          channels.channel AS channel,
          program.local_title
     FROM program
          LEFT JOIN program_producer
             ON program_producer.id_program = program.id_program
          LEFT JOIN producers
             ON producers.id_producer = program_producer.id_producer
          LEFT JOIN genres
             ON program.p_genre = genres.id_genre
          LEFT JOIN xcountries
             ON program.p_country = xcountries.id_country
          LEFT JOIN channels
             ON program.p_channel = channels.id_channel
GROUP BY program.id_program,
          program.original_title,
          genres.genre,
          genres.type_,
          program.director,
          program.origin1,
          program.broadcast_time,
          program.duration,
          channels.channel,
          program.local_title;

显示查询没有错误;修复部分组成的架构并添加一些数据,以检查它们是否得到预期的结果。

为什么要在中使用
,并在该部分中使用另一个子查询,而不是将
生产者
加入到
节目制作者
?为什么要按常量而不是列值排序?我想这只是一个错误?我不知道你为什么有子查询,并且没有连接到主查询中的第四个表并使用
group by
子句……无论我使用join子句还是in子句,都不会改变我的listagg函数将需要嵌套查询的事实,因此,当引用prgm_idA join将取消一级嵌套时,同样的问题也会发生;你已经有一个额外的冗余级别了。您可以将其简化为单个子查询,然后可以查看外部查询的列值;或者在主查询中删除包含额外连接和group by的子查询。你是对的,我只是没有看到它。。。非常感谢。第二个解决方案看起来很简单。。我不知道为什么我能看到它,我想listagg的事让我迷路了。非常感谢,因为我对如何在组内使用不太熟悉,请你帮我弄清楚,当listagg函数中未选择“row_order”时,我如何才能“order by producer.row_order”?@Marc-它不需要在select list或GROUP by子句中;您只需将其更改为组内的
(按生产者排序。行\顺序)作为生产者
。当然,假设这实际上是该表中的一个列名。不知道它是否应该是来自
节目制作人的贷记订单或类似订单。很抱歉,我再次混淆了它,行顺序在表program\u producer中,而不是在producer中,因此正确的语法是“order by pp.row\u order”。谢谢你的反应