枚举 table 上的结果
Enumerate the results on a table
例如,我们有 3 个不同的数量输入
a=5 b=6 c=15
然后在查询中我们有 50 行的总结果
必要的是从值 1 开始将行枚举为 a。
然后第六个在 1 中再次开始,但具有 b 值
并用 c 重复,如果输入结束则输入 null
--SQL 服务器 2014 管理工作室
Example
enter image description here
这有点 有问题 因为关系数据库 table 中的行没有以任何特定顺序存储,所以 - 没有任何列可以确定那个顺序,你要么运气不好,要么必须依赖数据库的功能,这些功能会帮助你以某种方式对行进行排序。
您没有指定您使用的数据库;这是甲骨文的例子。看看你能不能把它调整到你使用的数据库。
想法是:三个循环,每个变量一个(a
、b
、c
)。游标 FOR
循环“滚动”通过 enumerate
列仍为空的行并更新它,直到计数器变量 i
达到限制(a
、b
或c
)。要更新的行由 ROWID
确定,它在 table 中是唯一的。是的,这只是一个愚蠢的 copy/paste,但是很简单并且确实可以完成工作。
示例 table(不想输入那么多,所以 - 这里只有 14 行):
SQL> select * from test;
COUNT ENUMERATE
----- ----------
AUS
MEX
USA
CHINA
AUS
MEX
USA
CHINA
AUS
MEX
USA
CHINA
AUS
MEX
14 rows selected.
SQL>
代码:变量调整为那几个样本行:
SQL> declare
2 a number := 3;
3 b number := 4;
4 c number := 2;
5 i number;
6 begin
7 -- looping for A
8 i := 1;
9 for cur_r in (select country, rowid rid
10 from test
11 where enumerate is null
12 )
13 loop
14 update test set
15 enumerate = i
16 where rowid = cur_r.rid;
17
18 i := i + 1;
19 exit when i > a;
20 end loop;
21
22 -- looping for B
23 i := 1;
24 for cur_r in (select country, rowid rid
25 from test
26 where enumerate is null
27 )
28 loop
29 update test set
30 enumerate = i
31 where rowid = cur_r.rid;
32
33 i := i + 1;
34 exit when i > b;
35 end loop;
36
37 -- looping for C
38 i := 1;
39 for cur_r in (select country, rowid rid
40 from test
41 where enumerate is null
42 )
43 loop
44 update test set
45 enumerate = i
46 where rowid = cur_r.rid;
47
48 i := i + 1;
49 exit when i > c;
50 end loop;
51 end;
52 /
PL/SQL procedure successfully completed.
结果:
SQL> select * from test;
COUNT ENUMERATE
----- ----------
AUS 1 -- the first 3 rows represent
MEX 2 -- variable A
USA 3 -- whose value is 3
CHINA 1 -- the next 4 rows
AUS 2 -- belong to
MEX 3 -- variable B
USA 4 -- whose value is 4
CHINA 1 -- the last 2 rows
AUS 2 -- belong to variable C, set to 2
MEX
USA
CHINA
AUS
MEX
14 rows selected.
SQL>
例如,我们有 3 个不同的数量输入 a=5 b=6 c=15 然后在查询中我们有 50 行的总结果 必要的是从值 1 开始将行枚举为 a。 然后第六个在 1 中再次开始,但具有 b 值 并用 c 重复,如果输入结束则输入 null
--SQL 服务器 2014 管理工作室
Example
enter image description here
这有点 有问题 因为关系数据库 table 中的行没有以任何特定顺序存储,所以 - 没有任何列可以确定那个顺序,你要么运气不好,要么必须依赖数据库的功能,这些功能会帮助你以某种方式对行进行排序。
您没有指定您使用的数据库;这是甲骨文的例子。看看你能不能把它调整到你使用的数据库。
想法是:三个循环,每个变量一个(a
、b
、c
)。游标 FOR
循环“滚动”通过 enumerate
列仍为空的行并更新它,直到计数器变量 i
达到限制(a
、b
或c
)。要更新的行由 ROWID
确定,它在 table 中是唯一的。是的,这只是一个愚蠢的 copy/paste,但是很简单并且确实可以完成工作。
示例 table(不想输入那么多,所以 - 这里只有 14 行):
SQL> select * from test;
COUNT ENUMERATE
----- ----------
AUS
MEX
USA
CHINA
AUS
MEX
USA
CHINA
AUS
MEX
USA
CHINA
AUS
MEX
14 rows selected.
SQL>
代码:变量调整为那几个样本行:
SQL> declare
2 a number := 3;
3 b number := 4;
4 c number := 2;
5 i number;
6 begin
7 -- looping for A
8 i := 1;
9 for cur_r in (select country, rowid rid
10 from test
11 where enumerate is null
12 )
13 loop
14 update test set
15 enumerate = i
16 where rowid = cur_r.rid;
17
18 i := i + 1;
19 exit when i > a;
20 end loop;
21
22 -- looping for B
23 i := 1;
24 for cur_r in (select country, rowid rid
25 from test
26 where enumerate is null
27 )
28 loop
29 update test set
30 enumerate = i
31 where rowid = cur_r.rid;
32
33 i := i + 1;
34 exit when i > b;
35 end loop;
36
37 -- looping for C
38 i := 1;
39 for cur_r in (select country, rowid rid
40 from test
41 where enumerate is null
42 )
43 loop
44 update test set
45 enumerate = i
46 where rowid = cur_r.rid;
47
48 i := i + 1;
49 exit when i > c;
50 end loop;
51 end;
52 /
PL/SQL procedure successfully completed.
结果:
SQL> select * from test;
COUNT ENUMERATE
----- ----------
AUS 1 -- the first 3 rows represent
MEX 2 -- variable A
USA 3 -- whose value is 3
CHINA 1 -- the next 4 rows
AUS 2 -- belong to
MEX 3 -- variable B
USA 4 -- whose value is 4
CHINA 1 -- the last 2 rows
AUS 2 -- belong to variable C, set to 2
MEX
USA
CHINA
AUS
MEX
14 rows selected.
SQL>