关于一个查询错误

时间:2016-12-08 17:56:48

标签: sql oracle ora-00904

这是我的要求,当我使用以下查询时,我得到了正确的答案,但问题是我想选择不同的记录,所以请帮助我如何在下面的查询中使用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'

2 个答案:

答案 0 :(得分:0)

您的子查询返回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

答案 1 :(得分:0)

如果您需要从查询中获取不同的值,然后构建这些不同值的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
     )