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生成钟形曲线图,显示每个元素总和相同的组合计数.
如果用"独特的套装"表示你的意思(抱歉,我不知道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)
如果你想包括一对相同的数字,例如(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)