如何在 SQL (Oracle) 中创建一个 n*n 的结果集?
How to create a result set of n*n in SQL (Oracle)?
我需要创建一个包含 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
出于这个原因,我需要来自我的数据库的有序结果集,returns 笛卡尔积 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
...
我尝试在同一个数字 table 之间创建交叉连接两次,
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
和 -1
,因为 level
从 1
而不是 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
我需要创建一个包含 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
出于这个原因,我需要来自我的数据库的有序结果集,returns 笛卡尔积 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
...
我尝试在同一个数字 table 之间创建交叉连接两次,
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
和 -1
,因为 level
从 1
而不是 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