在SQL中,如何生成5!56的每个可能的唯一组合?

Fra*_* R. 4 sql oracle informix factorial apl

我有一个带有一个COLUMN"数字"的TABLE"元素",类型为SMALLINT,包含数字1到56.如何使用SQL语句生成从1到56的每个可能组合的5个数字的唯一集合?

在APL(编程语言)中,一个简单的二元函数5!56就可以了!

编辑:在良好的MS-DOS QBASIC中,我完成了这样的事情:

10  OPEN "C:\5NUMBERS.OUT" FOR OUTPUT ACCESS READ WRITE AS #1
12  LET SER = 0

15  LET E = 56
30      FOR B5 = 5 TO E
40          FOR B4 = 4 TO E
50              FOR B3 = 3 TO E
60                  FOR B2 = 2 TO E
70                      FOR B1 = 1 TO E
80

88  IF B5 = B1 THEN 190
89  IF B5 = B2 THEN 190
90  IF B5 = B3 THEN 190
91  IF B5 = B4 THEN 190

92  IF B4 = B1 THEN 180
93  IF B4 = B2 THEN 180
94  IF B4 = B3 THEN 180

95  IF B3 = B1 THEN 170
96  IF B3 = B2 THEN 170

97  IF B2 = B1 THEN 160

98 LET SER = SER + 1

100 PRINT #1, SER; "|";
130 PRINT #1, B1; "|";
131 PRINT #1, B2; "|";
132 PRINT #1, B3; "|";
133 PRINT #1, B4; "|";
134 PRINT #1, B5; "|";
140 PRINT #1, B1 + B2 + B3 + B4 + B5; "|"

150                     NEXT B1
160                 NEXT B2
170             NEXT B3
180         NEXT B4
190     NEXT B5
205 CLOSE
210 END
220 SYSTEM 
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这将我的加载文件创建到INFORMIX-SQL表中

TABLE combos
(
seq_id SERIAL,
ball_1 SMALLINT,
ball_2 SMALLINT,
ball_3 SMALLINT,
ball_4 SMALLINT,
ball_5 SMALLINT,
sum    SMALLINT
);
Run Code Online (Sandbox Code Playgroud)

我使用combos.sum生成钟形曲线图,显示每个元素总和相同的组合计数.

rua*_*akh 6

如果用"独特的套装"表示你的意思(抱歉,我不知道APL!),你可以这样写:

SELECT e1.number,   e2.number,   e3.number,   e4.number,   e.number
  FROM elements e1, elements e2, elements e3, elements e4, elements e5
 WHERE e1.number < e2.number
   AND e2.number < e3.number
   AND e3.number < e4.number
   AND e4.number < e5.number
;
Run Code Online (Sandbox Code Playgroud)

"这是否可以在不必将元素存储在表中的情况下实现?...即让服务器执行它而不依赖于表I/O?"

是的,有一个Oracle技巧可以使用分层查询和CTE语法动态生成数据:

WITH elements AS
( select rownum as number
  from dual
  connect by level <= 56 )
SELECT e1.number,   e2.number,   e3.number,   e4.number,   e.number
  FROM elements e1, elements e2, elements e3, elements e4, elements e5
 WHERE e1.number < e2.number
   AND e2.number < e3.number
   AND e3.number < e4.number
   AND e4.number < e5.number
;
Run Code Online (Sandbox Code Playgroud)


Jef*_*emp 5

如果你想包括一对相同的数字,例如(5,5):

SELECT e1.number AS number1
      ,e2.number AS number2
FROM   elements e1
      ,elements e2
WHERE  e1.number <= e2.number;
Run Code Online (Sandbox Code Playgroud)

如果您希望每对中只有不同的数字:

SELECT e1.number AS number1
      ,e2.number AS number2
FROM   elements e1
      ,elements e2
WHERE  e1.number < e2.number;
Run Code Online (Sandbox Code Playgroud)