Sql 随条件增加i
每当v_id的值不同时,我想增加I乘以1Sql 随条件增加i,sql,oracle,for-loop,plsql,increment,Sql,Oracle,For Loop,Plsql,Increment,每当v_id的值不同时,我想增加I乘以1 i = 1; for i in 1..10 loop SELECT subject_details.NEXTVAL INTO v_id FROM dual; INSERT INTO employee (id, subject) VALUES (i,v_id); i = i + 1; end loop; 它的作用是
i = 1;
for i in 1..10 loop
SELECT subject_details.NEXTVAL
INTO v_id
FROM dual;
INSERT INTO employee (id, subject)
VALUES (i,v_id);
i = i + 1;
end loop;
它的作用是
id subject
1 3647
2 3647
3 5678
4 5678
5 5678
但我想要的是,每当“v_id”的值发生变化时,将“I”的值增加1
试一试
我想你可以使用
densite\u rank()
:
如果这些值可以交错,则可以使用lag()
和累积和:
select t.*,
sum(case when prev_subject = subject then 0 else 1 end) over (order by id)
from (select t.*,
lag(subject) over (order by id) as prev_subject
from t
) t;
虽然有很多好的建议,但我认为它们大多都会错过你最大的错误。我认为这是对pl/sql范围规则的误解。在tour代码的某个地方(在发布之前),您定义了一个变量,然后我创建了一个i作为FOR循环的索引变量。您面临的问题是,由于作用域规则,这些变量不相同。根据:(另见) 对于索引名
隐式声明的整数变量的名称 本地到FOR循环语句。循环外的语句不能 参考索引。循环中的语句可以引用索引,但是 无法更改其值。在FOR循环语句运行之后,索引将被删除 未定义 您的流程还存在一些其他问题:
- 在Oracle中,赋值运算符为:=not=;(我想这只是 打字错误)
- 在每个循环迭代中运行“subject_details.NEXTVAL”,然后 随后将该结果插入表中。这样做将 每次递增该值。因此,你不能产生你想要的结果 输出-也不是您声称的输出
i=v_id-999
?这里的v_id值只是一个示例。它也可以是74685或36495。我想知道如何调用序列。nextval在连续迭代中返回相同的值Offtopic:whySELECT subject\u details.nextval从dual到v\u id
而不是v\u id:=subject\u details.nextval
?我会放弃这个循环,希望采用Gordon的稠密等级思想,并将其用于插入。。。。改为选择…
语句。你可能也在循环一个光标,这会很慢。当您可以执行基于集合的处理(例如,单个SQL语句)时,不要执行逐行处理(例如,通过游标循环)。嗨,Zakaria,欢迎使用堆栈溢出。虽然您的代码可以回答这个问题,但您可以通过提供上下文来改进它:这是如何/为什么解决这个问题的?你所做的与提问者所做的有什么不同?但我希望将这些值插入表中。可以在insert语句中使用密集秩吗?@newintodev。对任何select
语句都与insert
一起使用。
j = 1;
v_id_copy = 0;
for i in 1..10 loop
SELECT subject_details.NEXTVAL INTO v_id FROM dual;
if(v_id_copy==0) then
v_id_copy = v_id;
elseif (v_id_copy != v_id) then
j=j+1;
v_copy_id=v_id;
endif
insert into employee (id,subject) values (j,v_id)
end loop;
select t.*, dense_rank() over (order by subject)
from t;
select t.*,
sum(case when prev_subject = subject then 0 else 1 end) over (order by id)
from (select t.*,
lag(subject) over (order by id) as prev_subject
from t
) t;