从多个位置挑选足够的物品而不做rbar

时间:2013-12-20 11:26:09

标签: sql tsql rbar

我有一个仓库,每个项目编号可以在多个位置。 我有一个首选订单从哪里挑选。

ITEM   LOC   IN_STOCK
item_1 loc_1 3
item_1 loc_2 3
item_1 loc_3 2
item_2 loc_1 4

首选顺序是位置名称的函数,为简单起见,我们只能说它是order by loc asc

我有订单

item_1 4
item 2 2

我想要一个选项列表进入第三个表格。

item_1 loc_1 3
item_1 loc_2 1
item_2 loc_1 2

如果我只是加入,我会收到三行item_1

我想在单个sql语句中执行此操作,而不是RBAR,Row By Agonizing Row循环。

我正在使用Mssql 2008

1 个答案:

答案 0 :(得分:0)

请尝试使用CTE:

;with T as(
  select *,ROW_NUMBER() over(partition by item order by in_stock, LOC desc) RNum
  From warehouse)
select 
    x.Item,
    x.Loc,
    (case when SM-ItemNum<=in_stock then SM-ItemNum else in_stock end) as in_stock
From(
    select *,(select SUM(b.In_stock) from T b where b.item=a.item and b.RNum<=a.RNum) SM
    from T a
)x inner join orders c on x.item=c.item
where SM-ItemNum>0

在此处检查解决方案SQL Fiddle Demo