1

表格示例

我有这两个表和 SQL Server 中的一些示例数据。

Rules表只是表中的SELECT DISTINCT (DataSource_Id, LocationCode, WarehouseCode, WarehouseName, MTO_Regional)一个Inventory

我想根据where/if 三个“SSIn ...”列中的任何一个中的值来更新表中的SS_Value列。RulesMTO_MTSInventory

示例: Rules 表中的第一条记录将获取 Inventory 表中的第一个 MTO_MTS 值,该值基于(DataSource_Id、LocationCode、WarehouseCode、WarehouseName、MTO_MTSRegional)匹配并且有一个不为 0 的“SSIn...”列。

因此它可以抓取 Inventory 中的前两条记录中的任何一条,因为这 5 列匹配,并且至少有一个 SSIn.. 列是非零

到目前为止我已经尝试过:

我试过使用游标,但有数百万条记录,所以无法处理。我正在尝试构建一个更新语句,但无法弄清楚语法。

UPDATE Rules r
SET SS_Value = (SELECT TOP(1) MTO_MTS FROM Inventory ip
                WHERE r.DataSource_Id = ip.DataSource_Id
                AND r.LocationCode = ip.LocationCode 
                AND r.WarehouseCode = ip.WarehouseCode
                AND r.WarehouseName = ip.WarehouseName
                AND r.MTO_MTSRegional = ip.MTO_MTSRegional 
                (ip.SafetyStockInKLG <> 0 OR ip.SafetyStockInLTR <> 0 OR ip.SafetyStockInUnits <> 0)

我认为这个一般想法中的某些东西可能有效,但我无法正确使用语法。

我还尝试了如下语法:

UPDATE Rules
SET ip.SS_Value
FROM InventoryProduction ip 
INNER JOIN Rules

我遇到了查询中表的范围问题,并从正在更新的行中获取值以应用于 WHERE 子句。

4

2 回答 2

0

“第一个 MTO_MTS 值”是什么意思?

这将是一种方式,写为 SELECT,假设“first”表示“minimum”。使用它来验证它是否提供了你想要的东西,然后变成一个更新:

SELECT
 Rules.DataSourceID,
 Rules.LocationCode,
 Rules.WarehouseCode,
 Rules.WarehouseName,
 Rules.MTO_MTSRegional,
 SS_Value = MIN(Inventory.MTO_MTS)
FROM Rules
INNER JOIN Inventory
 ON Rules.DataSource_Id = Inventory.DataSource_Id
  AND Rules.LocationCode = Inventory.LocationCode 
  AND Rules.WarehouseCode = Inventory.WarehouseCode
  AND Rules.WarehouseName = Inventory.WarehouseName
  AND Rules.MTO_MTSRegional = Inventory.MTO_MTSRegional 
  (Inventory.SafetyStockInKLG <> 0 OR Inventory.SafetyStockInLTR <> 0 OR Inventory.SafetyStockInUnits <> 0)
GROUP BY
 Rules.DataSourceID,
 Rules.LocationCode,
 Rules.WarehouseCode,
 Rules.WarehouseName,
 Rules.MTO_MTSRegional
于 2013-09-26T18:23:36.253 回答
0

第一步只选择一个可用于更新的行。您可以在 ROW_NUMBER() 的 ORDER BY 中添加更多列。它改变了 cl 输出。我希望它有效。

with cl
as
(SELECT MTO_MTS, ip.DataSource_Id, ip.LocationCode, ip.WarehouseCode, ip.WarehouseName,  ip.MTO_MTSRegional, ROW_NUMBER() OVER(PARTITION BY MTO_MTS ORDER BY DataSource_Id) rn
FROM Inventory ip inner join Rules r on
r.DataSource_Id = ip.DataSource_Id
AND r.LocationCode = ip.LocationCode 
AND r.WarehouseCode = ip.WarehouseCode
AND r.WarehouseName = ip.WarehouseName
AND r.MTO_MTSRegional = ip.MTO_MTSRegional 
where  (ip.SafetyStockInKLG <> 0 OR ip.SafetyStockInLTR <> 0 OR ip.SafetyStockInUnits <> 0)
)

UPDATE r
SET SS_Value = cl.MTO_MTS
from Rules r inner join cl on r.DataSource_Id = cl.DataSource_Id
AND r.LocationCode = cl.LocationCode 
AND r.WarehouseCode = cl.WarehouseCode
AND r.WarehouseName = cl.WarehouseName
AND r.MTO_MTSRegional = cl.MTO_MTSRegional 
where cl.rn = 1
于 2013-09-26T18:49:31.430 回答