Tsql 在T-SQL中通过表顺序解析的最佳方法

Tsql 在T-SQL中通过表顺序解析的最佳方法,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我正在用SQL Server编写一个存储过程,希望有人能提出一种计算效率更高的方法来处理此问题: 我有一个客户订单(即“产品需求”)数据表,其中包含3000个行项目。每条记录表示特定产品的订单数量 我还有另一个生产订单表(即“产品供应”)数据,其中包含大约200个行项目。每条记录表示每个特定产品的可用数量 问题在于,通常供应少于需求,因此,自定义订单表包含一个分配优先级值,该值显示每个客户订单在接收产品的行中的位置 将生产订单中的可用数量分配给客户订单中的订单数量的最佳方法是什么?请注意,您不能

我正在用SQL Server编写一个存储过程,希望有人能提出一种计算效率更高的方法来处理此问题:

我有一个客户订单(即“产品需求”)数据表,其中包含3000个行项目。每条记录表示特定产品的订单数量

我还有另一个生产订单表(即“产品供应”)数据,其中包含大约200个行项目。每条记录表示每个特定产品的可用数量

问题在于,通常供应少于需求,因此,自定义订单表包含一个分配优先级值,该值显示每个客户订单在接收产品的行中的位置

将生产订单中的可用数量分配给客户订单中的订单数量的最佳方法是什么?请注意,您不能为每个客户订单分配超过已订购的数量

我可以通过创建一个WHILE循环,一个产品一个产品地分配,一行一行地分配,但是速度非常慢


有没有一种更快的基于集合的方法来解决这个问题?

我没有可以测试的数据。这不会尝试填充部分数量

 select orders.custID, orders.priority, orders.prodID, orders.qty, SUM(cumu.qty) as 'cumu'
 from orders 
 join orders as cumu 
 on cumu.prodID = orders.prodID 
    and cumu.priority <= orders.priority
 join available 
 on availble.prodID = orders.prodID  
 group by orders.custID, orders.priority, orders.prodID, orders.qty 
 having SUM(cumu.qty) < availble.qty
 order by orders.custID, orders.priority, orders.prodID
选择orders.custID、orders.priority、orders.prodID、orders.qty、SUM(累计数量)作为“累计单位”
从命令
以cumu的身份加入订单
在cumu.prodID=orders.prodID上

和cumu.priority我没有数据可供检验。这不会尝试填充部分数量

 select orders.custID, orders.priority, orders.prodID, orders.qty, SUM(cumu.qty) as 'cumu'
 from orders 
 join orders as cumu 
 on cumu.prodID = orders.prodID 
    and cumu.priority <= orders.priority
 join available 
 on availble.prodID = orders.prodID  
 group by orders.custID, orders.priority, orders.prodID, orders.qty 
 having SUM(cumu.qty) < availble.qty
 order by orders.custID, orders.priority, orders.prodID
选择orders.custID、orders.priority、orders.prodID、orders.qty、SUM(累计数量)作为“累计单位”
从命令
以cumu的身份加入订单
在cumu.prodID=orders.prodID上

和cumu.priority您当前的逐行逻辑是什么样子的?哈波,我想你把我引向了正确的方向!我不知道公共表表达式(CommonTableExpressions,CTE)是一种基于集合的递归处理记录的方法,但我认为这正是我在这里需要的。我曾尝试实施CTE,但没有成功,但我会继续努力。非常感谢。为了回答前面的问题,我们正在运行SQLServer2008R2。我已经抛弃了我的代码,但我只想说,我采用了一种过程方法,使用临时表和WHILE循环递归地遍历每一行。正如我在下面所说的,我认为公共表表达式(CTE)在这里的性能可能会更好,这仅仅是基于我到目前为止对它们了解的很少?哈波,我想你把我引向了正确的方向!我不知道公共表表达式(CommonTableExpressions,CTE)是一种基于集合的递归处理记录的方法,但我认为这正是我在这里需要的。我曾尝试实施CTE,但没有成功,但我会继续努力。非常感谢。为了回答前面的问题,我们正在运行SQLServer2008R2。我已经抛弃了我的代码,但我只想说,我采用了一种过程方法,使用临时表和WHILE循环递归地遍历每一行。正如我在下面所说的,我认为公共表表达式(CTE)在这里的性能可能会更好,这是基于我迄今为止对它们了解的很少。这太棒了!我还没有测试它,但我同意你的方法只处理全部分配,但这将覆盖90%以上的订单,我可以在之后通过执行剩余的部分分配来清理。之后。如果你将其更改为cumu.priority