选择低于一定金额的每种可能组合?

时间:2012-01-22 02:44:54

标签: sql

我有一个名为Item的表,它有ID,名称和价格。 是否可以使用SQL select语句获得低于特定价格的所有可能但不同的项目组合?

例如,假设此表:

ID  Name  Price     
--  ----  -----
1   A     1         
2   B     2         
3   C     3         
4   D     4         
5   E     5    

该限制是例如10的查询,只会返回A, B, C, D,但不会再返回A, B, D, C

这样的事情是否可能?请原谅这个可能很愚蠢的问题,但我现在正在学习SQL一年,但我们的老师甚至没有解释SQL的含义。我的全部知识来自书本,所以我不确定这是否是一个合适的问题。

3 个答案:

答案 0 :(得分:4)

好吧,因为Getting all possible combinations which obey certain condition with MS SQL没有产生任何灵感,所以这里改编了代码;)

declare @data table (id int not null primary key, name varchar(40) not null, price money not null);
insert into @data (id, name, price) values (1, 'A', 1), (2, 'B', 2), (3, 'C', 3), (4, 'D', 4), (5, 'E', 5);

-- Replace @data with actual table name and delete the above

with
anchor as (
  select id, name, price
  from @data
),
cte as (
  select
    id as max_id,
    price,
    '|' + cast(id as varchar(max)) + '|' as level 
  from anchor

  union all

  select
    a.id as max_id,
    c.price + a.price,
    c.level + '|' + cast(a.id as varchar(max)) + '|' as level
  from
    cte c
    inner join anchor a on a.id > c.max_id and c.level not like '%|' + cast(a.id as varchar(max)) + '|%'
)
select level
from cte
where price <= 10
;

答案 1 :(得分:1)

这是一个很好的问题,但据我所知,采用基于集合的方法是不可能的。某些基于CTE的递归可能可能,但如果是这样,我无法想到如何。它可以用游标完成,但不能直接使用“SQL select语句”(我将其解释为基于集合的方法)。

如果你想找到恰好两个小于x的数字的所有组合,你可以将表交叉连接到自身(消除ID相同的行)并将两个价格相加,不包括小于X

答案 2 :(得分:0)

如果你想要2个项目的组合,它很简单,只需加入表格就没有条件(所以你做笛卡尔积),然后将两个表格中的项目价格相加(你可以排除同一个项目)两次,如果你需要的话。)

根据定义,不可能在SQL中推广N个项目,因为它在关系代数中是不可能的。你需要一个N行的查询,N是记录的数量,所以你需要提前知道最多的记录数。

此外,N元素的组合(如果这是你需要的)是O(N!)所以它在尺寸和可能性方面都变得非常快,所以如果你有太多元素和价格足够大你很快就会面对任何可能的计算机的限制。