SQL查询:在所有记录中查找唯一的数字组合

时间:2011-12-19 16:07:05

标签: sql sql-server sql-server-2005

我正在尝试在SQL Server中创建一个查询,该查询将搜索表中的所有数字组合。

COMBINATION TABLE

CombID     Comb_Num1     Comb_NumTwo     Comb_NumThree
   1           1              2                3
   2           2              10               15
   3           5              20               60
   4           10             22               50
   5           22             33               46           

数字范围为1-60,组合中不重复相同的数字。订单无关紧要。

输入表

EntryID     NumberOne     NumberTwo     NumberThree     NumberFour     NumberFive
   1            10           22             33              46              50
   2            2            10             15              22              40
   3            24           33             40              45              50
   4            5            10             22              40              60
   5            2            6              10              22              40
   6            2            10             22              50              60
   7            10           22             33              46              50

数字范围为1-60,并且在条目中不会重复相同的数字。订单无关紧要。

结果

  • 搜索组合1将不会产生任何结果
  • 搜索组合2将返回EntryID 2
  • 搜索组合3不会产生任何结果
  • 搜索组合4将返回EntryID 1,6,7
  • 搜索组合5将返回EntryID 1,7

查询还应该为组合表中的每条记录显示它在Entry表中出现的次数。它应该排除条目表中没有出现的组合。

2 个答案:

答案 0 :(得分:6)

尝试:

select distinct e.EntryID
from entry e, combination c
where c.Comb_Num1 in (e.NumberOne, e.NumberTwo, e.NumberThree, e.NumberFour, e.NumberFive)
and   c.Comb_Num2 in (e.NumberOne, e.NumberTwo, e.NumberThree, e.NumberFour, e.NumberFive)
and   c.Comb_Num3 in (e.NumberOne, e.NumberTwo, e.NumberThree, e.NumberFour, e.NumberFive)
and   c.CombID = @CombID

- 返回特定@CombID的匹配条目

答案 1 :(得分:0)

蛮力会这样做:

SELECT EntryID
FROM combinations
INNER JOIN entries ON
  (Comb_Num1=NumberOne AND Comb_NumTwo=NumberTwo AND Comb_NumThree=NumberThree)
  OR (Comb_Num1=NumberTwo AND Comb_NumTwo=NumberThree AND Comb_NumThree=NumberFour)
  OR (Comb_Num1=NumberThree AND Comb_NumTwo=NumberFour AND Comb_NumThree=NumberFive)
WHERE CombID=<whatever>

这一点可以考虑到你不想要的订单。要解决此问题,您要创建另一个表(一次创建),对于Comb_Num1,CombNumTwo和CombNumThree的所有排列具有相同的CombID,或者以相同的方式扩展疯狂连接条件。这是作为练习留给读者的。