我正在对oracle进行查询,以更新表中的标记,以便对标记的行进行一些处理。
我的问题是我想限制每次更新到特定批量大小的行数,以及按结果更新的组。
我很难用抽象的术语来解释,所以我会实现它。
假设我有一个名为'staging'的表,其中包含以下字段:(Id,IdFile分组,名称,地址1,地址2,地址3,国家/地区,令牌)
我要做的是创建一个查询来使用此信息进行批处理。
对于每个批次,我更新令牌,以便将这些记录标记为稍后工作。 我想要一个批处理文件,每个批次都有一个大小限制,所以我使用rownum来限制它。 我的另一个限制是按批次分组。
假设我的批量大小是5,如果我有3个且只有3行并且分组列已填满,我必须创建一个只有3行的批处理。
这是我最大的宠儿,因为当我正在进行小组讨论时,我得到的结果只有一个批次结果,有或没有分组。 (如果我有分组,我必须查看所有行的命运地址是否相同,并创建一个批处理。)
您能帮助我了解如何创建此查询吗?
我现在正在使用的是:
update schema.staging set
token = 'token4'
where id in ( select t.id
from (
select stage.id, stage.grouping
from (select idFile
from (select a.idFile
from schema.staging a
inner join schema.config c on c.id = a.idcfgpriority
where nvl2(a.token,0,1) = 1
group by a.idFile, c.order
order by c.order desc) files
where rownum = 1 ) priorityFile
inner join schema.staging stage on stage.idFile = priorityFile.idFile
where nvl2(stage.token,0,1) = 1
group by stage.idFile, stage.token, stage.id, grouping sets ( (stage.grouping),
(stage.name, stage.Address1,stage.Address2,stage.Address3,stage.Country))
order by stage.grouping
) t
where rownum <= 5 )
以下数据:
Id IdFile Grouping Name Address1 Address2 Address3 Country Token
====================================================================================
1 1 null Name1 Address1 Address1 Address1 Country null
2 1 1 Name1 Address1 Address1 Address1 Country null
3 1 1 Name1 Address1 Address1 Address1 Country null
4 1 1 Name1 Address1 Address1 Address1 Country null
5 1 2 Name1 Address1 Address1 Address1 Country null
6 1 2 LALAL XPTO Address1 Address1 Country null
7 1 null Name1 Address1 Address1 Address1 Country null
8 1 null Name1 Address1 Address1 Address1 Country null
9 1 null Name1 Address1 Address1 Address1 Country null
10 2 null Name1 Address1 Address1 Address1 Country null
11 2 null Name1 Address1 Address1 Address1 Country null
12 2 null Name1 Address1 Address1 Address1 Country null
13 2 null Name1 Address1 Address1 Address1 Country null
14 2 null Name1 Address1 Address1 Address1 Country null
15 2 null Name1 Address1 Address1 Address1 Country null
我期待6批次。
batch#1: 1, 7, 8, 9
batch#2: 2, 3, 4
batch#3: 5
batch#4: 6
batch#5: 10, 11, 12, 13, 14
batch#6: 15
Sooo ......有没有人有任何想法?
干杯
答案 0 :(得分:1)
我不确定是否完全理解所有要求的详细信息,但根据您的示例数据和查询后所需的输出将起作用:
SELECT dense_rank() over(ORDER BY "IdFile",
"Grouping" nulls FIRST,
"Name" desc,
"Address1",
"Address2",
"Address3",
"Country",
"Token",
row_num) batch_num,
q.*
FROM (SELECT trunc((row_number()
over(partition BY "IdFile",
"Grouping",
"Name",
"Address1",
"Address2",
"Address3",
"Country",
"Token" ORDER BY "Id") - 1) / 5) row_num,
s.*
FROM sample s) q
ORDER BY "Id";
结果:
| BATCH_NUM | ROW_NUM | ID | IDFILE | GROUPING | NAME | ADDRESS1 | ADDRESS2 | ADDRESS3 | COUNTRY | TOKEN |
|-----------|---------|----|--------|----------|-------|----------|----------|----------|---------|--------|
| 1 | 0 | 1 | 1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 2 | 0 | 2 | 1 | 1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 2 | 0 | 3 | 1 | 1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 2 | 0 | 4 | 1 | 1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 3 | 0 | 5 | 1 | 2 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 4 | 0 | 6 | 1 | 2 | LALAL | XPTO | Address1 | Address1 | Country | (null) |
| 1 | 0 | 7 | 1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 1 | 0 | 8 | 1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 1 | 0 | 9 | 1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 5 | 0 | 10 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 5 | 0 | 11 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 5 | 0 | 12 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 5 | 0 | 13 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 5 | 0 | 14 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
| 6 | 1 | 15 | 2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
我已经玩了一些订购,以完全模拟您提供的批次编号。您可以安全地放弃desc
和nulls FIRST
部分。如果查询解决了您的问题,请告诉我。