2013-10-10 40 views
1

全部,導致ORA-00913的ROW_NUM函數:值太多錯誤?甲骨文

我想在祖父母表中配對兩個或多個記錄,以便我可以使用一個孫子從其中找到它的大孩子記錄。

所以結構像這樣

  • S_ASSET X 1的記錄
  • S_ASSET_X ×2子記錄
  • CX_ASSET_XM X 1盛大子記錄

因此基數是一個祖父母可以有2個Gr小孩記錄

此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

+0

我不確定我完全理解你需要完成什麼,你能提供一個帶有記錄等所有ID和預期輸出的樣本數據嗎? –

回答

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 
); 

我不確定這是你想要的 - 你可以檢查它嗎?

+0

這個工程,但我仍然越來越大的兒童記錄以及最近的一個。我如何過濾掉? – kaleeway

+0

唯一的其他選擇是我在我的Java應用程序中過濾它,但我想這不是解決查詢問題。 – kaleeway

+0

給我幾分鐘,我必須創建一個測試用例。你能提供樣本數據嗎? –