Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL表中查询所有可能的数字1-69的5个数字组合的逻辑问题_Sql_Sql Server_Algorithm - Fatal编程技术网

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

如何在SQL表中查询所有可能的数字1-69的5个数字组合的逻辑问题,sql,sql-server,algorithm,Sql,Sql Server,Algorithm,编辑:只是澄清一下,结果的顺序只在1,2,3,4,5和5,4,3,2,1应该是相同的记录时才重要。所以我在寻找不同的组合 我正在寻找建立一个SQL数据库,其中包含所有可能的5个数字组合1-69,其中同一个数字不能在单个5个数字组合中使用两次。结果将包含11238513条记录。我在编写代码以使其在所有逻辑都正常工作时遇到问题。我曾尝试在ExcelVBA中使用一个疯狂的宏,但我觉得SQL会有更简单、更快的功能。我也问过类似的问题,但我也没能做到 我已经尝试了下面的变体,但我似乎无法概念化我应该如何攻

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

我正在寻找建立一个SQL数据库,其中包含所有可能的5个数字组合1-69,其中同一个数字不能在单个5个数字组合中使用两次。结果将包含11238513条记录。我在编写代码以使其在所有逻辑都正常工作时遇到问题。我曾尝试在ExcelVBA中使用一个疯狂的宏,但我觉得SQL会有更简单、更快的功能。我也问过类似的问题,但我也没能做到

我已经尝试了下面的变体,但我似乎无法概念化我应该如何攻击它。有什么帮助吗

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
试试这个:

select r1.num1, r2.num1, r3.num1, r4.num1, r5.num1 
from TEST1 r1, TEST1 r2, TEST1 r3, TEST1 r4, TEST1 r5
where r1.num1 not in(r2.num1, r3.num1, r4.num1, r5.num1) and
r2.num1 not in(r3.num1, r4.num1, r5.num1) and
r3.num1 not in(r4.num1, r5.num1) and
r4.num1 not in(r5.num1)
order by r1.num1, r2.num1, r3.num1, r4.num1, r5.num1
通过这样做,您不需要选择其他列,假设其余列具有相同的值

如果其他列SNUM2、num3、num4、num5具有其他值,则需要:

select r1.num1, r2.num2, r3.num3, r4.num4, r5.num5 
from TEST1 r1, TEST1 r2, TEST1 r3, TEST1 r4, TEST1 r5
where r1.num1 not in(r2.num2, r3.num3, r4.num4, r5.num5) and
r2.num2 not in(r3.num3, r4.num4, r5.num5) and
r3.num3 not in(r4.num4, r5.num5) and
r4.num4 not in(r5.num5)
order by r1.num1, r2.num2, r3.num3, r4.num4, r5.num5

笛卡尔乘积将表自身移动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

有一个简单的解决办法。见下面我的答案。所有其他答案都给出了错误的答案,因为它们包括每个组合的排列。顺便说一句,还有其他方法可以解决这个问题。。。。提示:使用横向视图子查询。。。。但那更复杂。。。而且并非所有数据库都支持。。。。