2013-10-31 2 views
0

의 하위 집합을 찾는 방법은? 동일한 쿼리에 대해 여러 개의 대답이있을 수 있습니다. 그들 모두를 어떻게 생성 할 것입니까? 한 가지 방법으로, 이것은 나에게도 배낭 문제처럼 보이지만, 나는 SQL로 같은 것을 표현하는 방법을 모릅니다.SQL 쿼리는이 테이블을 감안할 때 주어진 테이블

당신은 아마 웹 페이지

+0

당신은 질문에 대한 링크에서 데이터를 추가 할 위치의 마지막을 제거 할 수 있습니다. 그런 다음 링크가 끊어지고 미래의 방문자에게 질문은 쓸모가 없습니다. –

+1

SQL만으로 모든 가능한 솔루션을 생성 할 수 있다고 생각하지 않습니다. – user2864740

+0

질문을 업데이트했습니다. – Rahul

답변

0

당신은 재귀 CTE와 포스트 그레스에서이 작업을 수행 할 수있는 쿼리를

SELECT * FROM OrderDetails; 

를 실행해야합니다,하지만 다량으로 비효율적 일 것입니다 :

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 
    )  

다른 조합을 추가 할 수 있는지 여부에 관계없이 모든 조합을 원한다면 수량 제한 버전, 당신은 절

Example SQL Fiddle

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

OP는 수량의 합이 90 이하인 OrderId의 목록을 원합니다. 문제의 * 배낭 * 참조를 기반으로 실제로 주문 ID 목록이 필요합니다. 쿼리가 0보다 작은 각 주문 ID를 반환한다는 이상한 요청 –

+1

을 요청하십시오. 해당 목록의 수량 합계가 90보다 작은 orderid 목록이 필요합니다. – Rahul

+0

위 쿼리가 수행하는 작업이 아닌가요? 위의 쿼리는 합계가 90보다 작은 OrderID를 보여줍니다. – Linger

관련 문제