一尘不染

有关如何在SQL表中查询数字1-69的所有可能5个数字组合的逻辑问题

sql

编辑:只是为了澄清,结果的顺序仅在1,2,3,4,5和5,4,3,2,1应该是相同的记录才重要。所以我正在寻找不同的组合。

我正在寻找一个SQL数据库,该数据库具有数字1-69的所有可能的5个数字组合,其中同一数字不能在单个5个数字组合中使用两次。结果将包含11,238,513条记录。我在编写代码时遇到麻烦,无法使其与所有逻辑配合正常工作。我曾尝试在Excel
VBA中使用疯狂的宏,但我觉得SQL会更简单,更快捷。我已经问过类似的问题,但是它也没有使我到达那里(我如何基于1-69范围内的数字列表创建5个数字排列的列表?)。

我已经尝试过下面的变体,但是我似乎无法概念化如何应对这个问题。有什么帮助吗?

WITH range
AS (
SELECT num1 AS c FROM TEST1
  UNION  
  SELECT num2 FROM TEST1
  UNION  
  SELECT num3 FROM TEST1
  UNION  
  SELECT num4 FROM TEST1
  UNION  
  SELECT num5 FROM TEST1)
SELECT *
FROM range r1,range r2,range r3,range r4,range r5
where r1.c <> r2.c and r1.c<>r3.c and r1.c<>r4.c and r1.c<>r5.c
and r2.c <> r3.c and r2.c<>r4.c and r2.c<>r5.c
and r3.c<>r4.c and r3.c<>r5.c
and r4.c <> r5.c
order by r1.c, r2.c, r3.c, r4.c, r5.c

阅读 115

收藏
2021-05-30

共1个答案

一尘不染

笛卡尔乘积表到其自身5次,并仅选择数字按升序排列的行(这确保不会多次选择相同的数字,并且不会对相同的5个数字进行排列):

SELECT r1.c, r2.c, r3.c, r4.c, r5.c
FROM range r1, range r2, range r3, range r4, range r5
WHERE r1.c<r2.c AND r2.c<r3.c AND r3.c<r4.c AND r4.c<r5.c
2021-05-30