Sql查询查找给定表的子集

时间:2013-10-31 23:51:47

标签: mysql sql postgresql subset

鉴于此表:

http://www.w3schools.com/sql/trysql.asp?filename=trysql_func_sum

如何生成OrderIds列表,其中数量总和最多为90.如何在SQL中表达相同的内容?同一查询可以有多个答案。你将如何产生它们?在某种程度上,这看起来像背包问题,但我不知道如何在SQL中表达相同。

您可能需要执行查询

SELECT * FROM OrderDetails;

在网页

2 个答案:

答案 0 :(得分:0)

SELECT OrderID, SUM(Quantity) AS TotalItemsOrdered 
FROM OrderDetails
GROUP BY OrderID
HAVING SUM(Quantity)<= 90

答案 1 :(得分:0)

您可以使用递归CTE在Postgres中执行此操作,但效率会非常低:

With Recursive search_orders(maxid, quantity, used) AS (
    Select
        od.OrderDetailsID,
        od.quantity,
        array[od.OrderDetailsID]
    from
        OrderDetails od
    Where
        quantity < 90
    Union All
    Select
        od.OrderDetailsID,
        sod.quantity + od.quantity,
        used || od.OrderDetailsID
    From
        OrderDetails od,
        search_orders sod
    Where
        od.OrderDetailsID > sod.maxid and
        od.quantity < 90 - sod.quantity
)
Select
    used,
    quantity
From
    search_orders sod
Where
    not exists (
        select 'x'
    from
        OrderDetails od
    Where
        Not od.OrderDetailsID = Any(used) and
        od.quantity < 90 - sod.quantity
    )    

如果您想要所有组合,无论您是否可以在不超过数量限制的情况下添加其他项目,您都可以删除最后一个where子句

<强> Example SQL Fiddle