【问题标题】:Regarding one query error关于一个查询错误
【发布时间】:2016-12-08 17:56:48
【问题描述】:

这是我在使用以下查询时的要求,我得到了正确的响应,但问题是我想选择不同的记录,所以请帮助我如何在以下查询中使用 distinct

SELECT LISTAGG(PAC.DESCRIPTION || ' = '|| ORL.ITEM_PACKAGE_COUNT , ',') WITHIN GROUP (ORDER BY PAC.DESCRIPTION || ' = '|| ORL.ITEM_PACKAGE_COUNT)
FROM ORDER_RELEASE_LINE ORL , PACKAGED_ITEM PAC , SHIPMENT SH , ORDER_MOVEMENT OM 
WHERE ORL.PACKAGED_ITEM_GID = PAC.PACKAGED_ITEM_GID
AND OM.ORDER_RELEASE_GID = ORL.ORDER_RELEASE_GID
AND OM.SHIPMENT_GID = SH.SHIPMENT_GID
AND  SH.SHIPMENT_GID = 'ULA/SAO.5000072118'

【问题讨论】:

  • (SELECT LISTAGG(PAC.DESCRIPTION || ' = '|| ORL.ITEM_PACKAGE_COUNT , ',') 组内(按 PAC.DESCRIPTION || '= '|| ORL.ITEM_PACKAGE_COUNT)来自(从 ORDER_RELEASE_LINE ORL、PACKAGED_ITEM PAC、SHIPMENT SH、ORDER_MOVEMENT OM 中选择不同的 PAC.DESCRIPTION ORL.PACKAGED_ITEM_GID = PAC.PACKAGED_ITEM_GID 和 OM.ORDER_RELEASE_GID = ORL.ORDER_RELEASE_GID 和 OM.SHIPMENT_GID = SH.SHIPMENT.PGID SAO.5000072118') PAC)
  • 请将您的查询添加到问题中(并适当地格式化)而不是作为评论。
  • 当然我会这样做..我是新手,所以我把它作为评论
  • 从 ORDER_RELEASE_LINE 中选择 LISTAGG(PAC.DESCRIPTION || '='|| ORL.ITEM_PACKAGE_COUNT , ',') 组内(按 PAC.DESCRIPTION || '='|| ORL.ITEM_PACKAGE_COUNT) ORL, PACKAGED_ITEM PAC, SHIPMENT SH, ORDER_MOVEMENT OM WHERE ORL.PACKAGED_ITEM_GID = PAC.PACKAGED_ITEM_GID AND OM.ORDER_RELEASE_GID = ORL.ORDER_RELEASE_GID AND OM.SHIPMENT_GID = SH.SHIPMENT_GID AND SH.SHIPMENT_GID = '2118.500007'
  • 请问有人知道如何在我的问题中提到的上述查询中使用 distinct 和 Listagg

标签: sql oracle ora-00904


【解决方案1】:

您的子查询返回 SELECT DISTINCT PAC.DESCRIPTION,但外部查询使用别名和来自内部查询的值 LISTAGG(PAC.DESCRIPTION || ' = '|| ORL.ITEM_PACKAGE_COUNT , ',') ORL.ITEM_PACKAGE_COUNT 不被子查询返回。试试:

SELECT LISTAGG(SUBQ.DESCRIPTION || ' = '|| SUBQ.ITEM_PACKAGE_COUNT , ',') 
          WITHIN GROUP (ORDER BY SUBQ.DESCRIPTION || ' = '|| SUBQ.ITEM_PACKAGE_COUNT) 
  FROM (SELECT DISTINCT PAC.DESCRIPTION, ORL.ITEM_PACKAGE_COUNT
         FROM ORDER_RELEASE_LINE ORL , PACKAGED_ITEM PAC , SHIPMENT SH , ORDER_MOVEMENT OM 
         WHERE ORL.PACKAGED_ITEM_GID = PAC.PACKAGED_ITEM_GID 
           AND OM.ORDER_RELEASE_GID = ORL.ORDER_RELEASE_GID 
           AND OM.SHIPMENT_GID = SH.SHIPMENT_GID 
           AND SH.SHIPMENT_GID = 'ULA/SAO.5000072118') SUBQ

通常,在表的内部查询中使用相同的别名PAC 和在连接数据结果的外部查询中使用相同的别名是错误的做法。另一个错误的做法是使用隐式连接而不是定义显式INNER JOIN ON

【讨论】:

  • 感谢您的回复,但问题是 PAC.Item_package_count 对我无效,因为 packaged_item 表中不存在名为 (ITEM_PACKAGE_COUNT) 的列。所以在内部查询中我可以选择不同的 PAC.DESCRIPTION, ORL.ITEM_PACKAGE_COUNT 但问题是我只能从 Order_release_line 表中获取 item_package_count。请帮忙
  • @otmnotifications 但PAC 中的LISTAGG 引用整个子查询而不是您的单个表PACKAGE。我已将其更改为 SUBQ
  • @otmnotifications 如果该查询不适合您,请编辑您的问题并在其中包含查询中使用的所有表的描述并描述您需要获取的内容。
【解决方案2】:

如果您需要从查询中获取不同的值,然后构建这些不同值的LISTAGG,您可以简单地在查询中使用DISTINCT,并在您使用LISTAGG 的地方将其包装在一个外部查询中。

例如:

with dupValTab(s) as
(
    select 'something' from dual union all
    select 'something else' from dual union all
    select 'something' from dual
)
select listagg(s, ', ') within group (order by s)
from (
      select distinct s
      from dupValTab
     )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2022-01-23
    • 2012-01-15
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多