2014-09-24 90 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