如何访问子查询中使用的 LISTAGG?

How do I access a LISTAGG that is used in sub query?

我有下面的查询,我正在尝试 select inner_query.ship_codes.

如果我这样做 inner_query.item_id_alias 它工作正常,但我怎么能 select ship_codes 来自我的 inner_query ?

SELECT inner_query.item_id_alias
FROM (
  SELECT li.item_id as item_id_alias,
         LISTAGG(a.ship_code, '; ')
           WITHIN GROUP (ORDER BY a.ship_code) as "ship_codes"
  FROM (
         SELECT DISTINCT
                ship_code, 
                MAX(order_id) as order_id
         FROM   orders o
         WHERE  o.order_id in (
                  SELECT li2.order_id
                  FROM   line_items li2 
                  GROUP BY li2.order_id
                ) 
         GROUP BY ship_code
       )a
       INNER JOIN line_items li ON a.order_id = li.order_id      
  GROUP BY li.item_id
) inner_query;

使用列别名。由于您在子查询中使用了带引号的标识符,因此您需要在外部查询中使用带引号的标识符(以及您可能想要引用它的任何其他地方):

SELECT inner_query.item_id_alias,
       inner_query."ship_codes"
FROM (
  SELECT li.item_id as item_id_alias,
         LISTAGG(a.ship_code, '; ')
           WITHIN GROUP (ORDER BY a.ship_code) as "ship_codes"
  FROM (
         SELECT DISTINCT
                ship_code, 
                MAX(order_id) as order_id
         FROM   orders o
         WHERE  o.order_id in (
                  SELECT li2.order_id
                  FROM   line_items li2 
                  GROUP BY li2.order_id
                ) 
         GROUP BY ship_code
       )a
       INNER JOIN line_items li ON a.order_id = li.order_id      
  GROUP BY li.item_id
) inner_query;

或者,您可以使用通配符:

SELECT *
FROM   (...) inner_query

或带有子查询别名的通配符:

SELECT inner_query.*
FROM   (...) inner_query

或子查询不带别名的标识符:

SELECT item_id_alias,
       "ship_codes"
FROM   (...) inner_query

(注意:在同一个 SELECT 语句中使用 DISTINCTGROUP BY 是没有意义的。您可以删除 DISTINCT 并且输出将不变。)