枚举 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 中的行没有以任何特定顺序存储,所以 - 没有任何列可以确定那个顺序,你要么运气不好,要么必须依赖数据库的功能,这些功能会帮助你以某种方式对行进行排序。

您没有指定您使用的数据库;这是甲骨文的例子。看看你能不能把它调整到你使用的数据库。

想法是:三个循环,每个变量一个(abc)。游标 FOR 循环“滚动”通过 enumerate 列仍为空的行并更新它,直到计数器变量 i 达到限制(abc)。要更新的行由 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>