Oracle11g 偏移和分组
我有两列“a”和“b”。a列有20条记录,我想从“a”列中选择前10条记录,并将“b”列更新为“c” 然后从a中选择接下来的10条记录,并将列“b”更新为“d”。? 我怎样才能做到这一点?有可能在其中使用偏移吗? 我尝试使用分区,但没有太大帮助,然后我想到了偏移量,但我如何循环选择10条记录并更新值Oracle11g 偏移和分组,oracle11g,plsqldeveloper,Oracle11g,Plsqldeveloper,我有两列“a”和“b”。a列有20条记录,我想从“a”列中选择前10条记录,并将“b”列更新为“c” 然后从a中选择接下来的10条记录,并将列“b”更新为“d”。? 我怎样才能做到这一点?有可能在其中使用偏移吗? 我尝试使用分区,但没有太大帮助,然后我想到了偏移量,但我如何循环选择10条记录并更新值 A B 1 2 3 4 5 6 我想取A的前三条记录,用C更新B,然后取下三条记录,用D更新B A B 1 C 2 C 3 C 4 D 5 D 6 D 根据您想要如何处理奇数行的情
A B
1
2
3
4
5
6
我想取A的前三条记录,用C更新B,然后取下三条记录,用D更新B
A B
1 C
2 C
3 C
4 D
5 D
6 D
根据您想要如何处理奇数行的情况—您想要更多的C还是更多的D,您可以使用以下两条合并语句之一更新行:
create table t1 as
select 1 a, cast(null as varchar2(2)) b from dual union all
select 2 a, null b from dual union all
select 3 a, null b from dual union all
select 4 a, null b from dual union all
select 5 a, null b from dual union all
select 6 a, null b from dual;
-- six rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
-- six rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
insert into t1 (a, b)
values (7, null);
commit;
-- seven rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
7 D
-- seven rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 C
5 D
6 D
7 D
drop table t1;
更多Ds:
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
更多政务司司长:
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
下面是我用来测试这两个语句的完整脚本:
create table t1 as
select 1 a, cast(null as varchar2(2)) b from dual union all
select 2 a, null b from dual union all
select 3 a, null b from dual union all
select 4 a, null b from dual union all
select 5 a, null b from dual union all
select 6 a, null b from dual;
-- six rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
-- six rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
insert into t1 (a, b)
values (7, null);
commit;
-- seven rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
7 D
-- seven rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over () cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 C
5 D
6 D
7 D
drop table t1;
你需要用一些样本数据和你期望的输出更新你的问题。好吧,在你的原始逻辑中,你有20行,前10行你希望你的B列值是C,其余的你希望值是D。在你的样本数据中,有6行,你想要3个C和3个D。实际的要求是,我有X行,我希望前半行有B=C,其余的是D?是的,完全正确…如果我们不进入奇数和偶数,并生成一个序列,假设给出C,D,e的输出,这必须在一个过程中完成。。。哪一个会进一步用c更新A列的前3条记录,然后用d更新下3条记录…依此类推,直到A中的所有记录都有相应的B…那么你建议我们怎么做呢?如果我更新t1集合B=c,其中A在从t1中选择A,其中B为空,只获取前3行,并将其保持在循环中以更新A的其余行?但是此查询不起作用,因为它表示缺少右键