ROW_NUM函数导致ORA-00913:值太多错误?神谕

时间:2013-10-10 11:09:37

标签: sql oracle select row-number

所有

我正在尝试在祖父母表中配对两个或更多记录,以便我可以使用一个孙子来找到它的大孩子记录。

所以结构是这样的

  • S_ASSET x 1条记录
  • S_ASSET_X x 2子记录
  • CX_ASSET_XM x 1个大孩子记录

因此,基数是一个祖父母可以有2个孙子记录

此CX_ASSET_XM表将保存有关Grandchild资产的TCP / IP调用的信息。这些调用未同步。因此,一个孙子资产今天可能会打电话,但另一个从昨天起就没有打过电话。

在我的查询中,我找到了今天创建的所有大孩子记录(sysdate),然后遍历关系以找到祖父母,然后我往下走,找到孙子元组中的另一个双胞胎。

我的查询的问题是它返回一对已经进行的每一个TCP / IP调用但我只想要每个孙子的最近回调来分析

这是一个例子

enter image description here

因此,为了最小化我的结果集,我尝试使用ROW_NUM函数来仅获取我需要的结果,这是每个大子记录的最新回调日期。

查询

SELECT cb.ssid, cb.created_by, cb.callback_date, cb.callback_num,
       asset.desc_text, asset.prom_integ_id, asset.integration_id
       --Traversing Up to find the Grandparent record of
FROM   SIEBEL.CX_ASSET_XM cb
       JOIN SIEBEL.S_ASSET_X assetx ON cb.SSID = assetx.attrib_37
       JOIN SIEBEL.S_ASSET asset ON assetx.par_row_id = asset.row_id
WHERE  asset.prom_integ_id IN
--Traversing Down to find the other pair
(   SELECT asset.prom_integ_id,
           ROW_NUMBER() OVER (PARTITION BY cb.ssid
                                  ORDER BY cb.callback_date DESC)
    FROM   SIEBEL.CX_ASSET_XM cb
           JOIN SIEBEL.S_ASSET_X assetx ON cb.ssid = assetx.attrib_37
           JOIN SIEBEL.S_ASSET asset ON assetx.par_row_id = asset.row_id
);

错误

ORA-00913: too many values
00913. 00000 -  "too many values"
*Cause:    
*Action:
Error at Line: 7 Column: 36

我是否在此查询结构中正确使用了ROW_NUM和PARTITION?

由于

ORACLE数据库版本 10g企业版10.2.0.3.0版 - 64位

1 个答案:

答案 0 :(得分:2)

问题是您使用IN运算符,在这种情况下,它需要处理一组值,但子查询返回两列,而不是一列:

WHERE asset.prom_integ_id IN
--Traversing Down to find the other pair
(   SELECT asset.prom_integ_id, ROW_NUMBER() OVER (PARTITION BY cb.ssid ORDER BY cb.callback_date DESC)

应该是:

WHERE asset.prom_integ_id IN
--Traversing Down to find the other pair
(   SELECT asset.prom_integ_id

并且,从那开始,我想从ROW_NUMBER返回的值应该提前访问,所以它看起来像这样:

SELECT cb.ssid, cb.created_by, cb.callback_date, cb.callback_num, asset.desc_text, asset.prom_integ_id, asset.integration_id
--Traversing Up to find the Grandparent record of
FROM SIEBEL.CX_ASSET_XM cb
    JOIN SIEBEL.S_ASSET_X assetx
      ON cb.SSID = assetx.attrib_37
    JOIN SIEBEL.S_ASSET asset
      ON assetx.par_row_id = asset.row_id
WHERE asset.prom_integ_id IN
--Traversing Down to find the other pair
(   SELECT prom_integ_id
    FROM (
SELECT asset.prom_integ_id, ROW_NUMBER() OVER (PARTITION BY cb.ssid ORDER BY cb.callback_date DESC) row_n
    FROM SIEBEL.CX_ASSET_XM cb
    JOIN SIEBEL.S_ASSET_X assetx
      ON cb.ssid = assetx.attrib_37
    JOIN SIEBEL.S_ASSET asset
      ON assetx.par_row_id = asset.row_id
) where row_n = 1
);

我不确定这是你想要的 - 你能检查一下吗?