如何在SQL(Oracle)中创建n * n的结果集?

时间:2015-11-16 12:36:46

标签: sql oracle birt

我需要创建一个包含n个数字矩阵的报告(BIRT),如下所示:

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3 
5 1 2 3 4

出于这个原因,我需要从我的数据库中获得一个有序的结果集,该结果集返回笛卡尔积n * n,行号和值从行号开始。

ROW  VALUE
 1     1
 1     2
 1     3
 1     4
 1     5     
 2     2
 2     3
 2     4
 2     5
 2     1
 3     3
 ...

我通过两次在同一个数字表之间创建交叉连接来尝试它,

select * from (
  (select level as nr from dual connect by level <= 5)
cross join 
  (select level as nr from dual connect by level <= 5)
);

但只产生

的结果集
ROW   VALUE
 1      1
 1      2
 ...
 2      1
 2      2
 ...

任何帮助表示赞赏,并对我的问题的奇怪描述感到抱歉。

1 个答案:

答案 0 :(得分:1)

您可以使用connect by生成数字,并使用division和modulo生成行和值。计算本身非常简单,但您需要几个+1-1,因为level1开始,而不是0

select
  trunc((level - 1) / N) + 1 as ROWNR,
  mod(level - 1 + trunc((level - 1) / N), N) + 1 as VALUE
from
  (select 5 /* Here goes your number N */ as N from dual) d
connect by
  level <= N*N