2014-09-24 19 views
0

我有一個臨時表,其中插入從SELECT查詢中提取的修改後的數據。將批號插入到Oracle中的表SQL

在這個臨時表我想組我行成批次,所以我在我的選擇增加了一個叫做「BATCH_NUM」的索引INT列

,我希望達到的思路是這樣的(對於比方說1000個結果聲明)。

僞碼

Batch Size = 100 
Count = 0 
For batch size in results set 
Insert Into Temp Table (a , b , y , count) 
Count++ 

當前SQL - 輸入靜態值1到BATCH_NUM列

INSERT INTO TEMP_TABLE 
(
    ASSET_ID, 
    PAR_PROM_INTEG_ID, 
    IGNORE 
    BATCH_NUM 
) 
SELECT carelevel.row_id, pstn.PROM_INTEG_ID, 
CASE 
    WHEN promoprod.fabric_cd = 'Disabled' 
    THEN 'Y' 
    ELSE 'N' 
END 
'1' 
FROM SIEBEL.S_ASSET carelevel 
INNER JOIN SIEBEL.S_ASSET pstn 
ON pstn.row_id = carelevel.par_asset_id 
INNER JOIN SIEBEl.S_ASSET promotion 
ON pstn.prom_integ_id = promotion.integration_id 
INNER JOIN SIEBEL.S_PROD_INT prod 
ON prod.row_id = carelevel.prod_id 
INNER JOIN SIEBEL.S_ORG_EXT bill 
ON carelevel.bill_accnt_id = bill.row_id 
INNER JOIN SIEBEL.S_INV_PROF invoice 
ON bill.row_id = invoice.accnt_id 
INNER JOIN SIEBEL.S_PROD_INT promoprod 
ON promotion.prod_id = promoprod.row_id 
WHERE prod.part_num = 'Testproduct' 

但如果select語句有1000個結果,那麼我想BATCH_NUM從1走,每100個記錄2,3,4,5,6,7,8,9,10。

可以這樣做嗎?

+1

你只想要第一批 - 或在同一時間將下列值作爲另一批次的一部分插入e? (比如說1-100 =>批次1,101-200 =>批次2) – 2014-09-24 15:25:49

+0

正確,遞增批次數量取決於結果集/批量大小 – kaleeway 2014-09-24 15:35:12

回答

3

要將記錄映射到批處理,您可能只需要使用整數除法。或者稍微複雜一點,因爲行數是從1開始編號的,但像TRUNC((ROWNUM-1)/100)+1這樣的東西就可以做到。

以下是一個映射測試:

select level, trunc((ROWNUM-1)/100)+1 from dual connect by level <= 1000 

結果:

ROWNUM TRUNC((ROWNUM-1)/100)+1 
1  1 
... 
100  1 
101  2 
... 
200  2 
201  3 
... 
... 
900  9 
901  10 
... 
1000 10 

鑑於你的查詢:

INSERT INTO TEMP_TABLE 
(
    ASSET_ID, 
    PAR_PROM_INTEG_ID, 
    IGNORE, 
    BATCH_NUM 
) 
SELECT carelevel.row_id, pstn.PROM_INTEG_ID, 
CASE 
    WHEN promoprod.fabric_cd = 'Disabled' 
    THEN 'Y' 
    ELSE 'N' 
END, 
TRUNC((ROWNUM-1)/100)+1, 
-- ^^^^^^^^^^^^^^^^^^^^ 
-- map rows 1-100 to batch 1, rows 101-200 to batch 2 and so on 
FROM SIEBEL.S_ASSET carelevel 
INNER JOIN SIEBEL.S_ASSET pstn 
ON pstn.row_id = carelevel.par_asset_id 
INNER JOIN SIEBEl.S_ASSET promotion 
ON pstn.prom_integ_id = promotion.integration_id 
INNER JOIN SIEBEL.S_PROD_INT prod 
ON prod.row_id = carelevel.prod_id 
INNER JOIN SIEBEL.S_ORG_EXT bill 
ON carelevel.bill_accnt_id = bill.row_id 
INNER JOIN SIEBEL.S_INV_PROF invoice 
ON bill.row_id = invoice.accnt_id 
INNER JOIN SIEBEL.S_PROD_INT promoprod 
ON promotion.prod_id = promoprod.row_id 
WHERE prod.part_num = 'Testproduct' 
+0

這很好,謝謝。 – kaleeway 2014-09-24 15:54:22