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

Oracle nested query reference parent column more than 1 level deep

我知道 oracle 对引用父级深度超过 1 级的嵌套查询的限制要求我们展示一些创造力,但我真的坚持这一点。

我需要创建一个视图,方法是选择一个名为 table 的包含电视节目的 table 字段,并在视图中包含一个名为 "PRODUCERS" 的字段,该字段必须是串联参与电视节目的所有制作人。

因此我最终在视图创建过程中处理了 3 tables:

计划(id_program,导演,...)

制片人(id_producer,姓名,...)

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

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

      (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,

或者您可以通过在主外部连接序列中包含额外的表并添加包含所有其他 select 列表项的 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;

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