【问题标题】:Insert a batch number into a table in Oracle SQL在 Oracle SQL 中将批号插入到表中
【发布时间】:2014-09-25 03:05:39
【问题描述】:

我有一个临时表,我在其中插入从 SELECT 查询中提取的修改数据。

在这个临时表中,我想将我的行分组为批次,因此我添加了一个名为“BATCH_NUM”的索引 INT 列

我希望实现的想法是这样的(比如我的 SELECT 语句中有 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 为每 100 条记录中的 1、2、3、4、5、6、7、8、9、10。

这个可以吗?

【问题讨论】:

  • 您只想要第一批 - 或者同时插入以下值作为另一批的一部分? (比如 1-100 => 第 1 批、101-200 => 第 2 批)
  • 正确,根据结果集/批次大小递增批次数

标签: sql oracle count


【解决方案1】:

要将记录映射到批处理,您可能只想使用整数除法。或者稍微复杂一点,因为行从 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2017-09-30
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多