2013-09-26 33 views
1

Table Example基于另一个具有一对多关系的更新表。没有游标

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

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

我想在那里Inventory /如果有任何三个值“SSIN ......”列更新基础上,MTO_MTSRulesSS_Value列。

例:在规则表将抢在相匹配基础上(DataSource_Id,LocationCode,WarehouseCode,WarehouseName,MTO_MTSRegional),并有一个库存表中的第一MTO_MTS值第1记录“SSIN ......”这是不为0

所以它可以抓住无论是前两个记录清单,因为这些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子句中的列的值。

+0

这3行中的哪一行是第一行?您如何订购? (请不要说“因为它是第一个”,我们需要一种方式来订购它们) – Lamak

+0

我不知道我100%理解你的问题。但是,我知道没有对Inventory表的设置顺序,只是将该记录插入到数据库中,并且存在递增的Id列。在符合标准的行中,您抓取哪一个并不重要。如果那不能回答你的问题,让我知道,我可以尝试更好地理解。 – mrshickadance

+0

“规则表中的第一条记录将获取”库存表“中的第一条** MTO_MTS值,那么,哪一条是第一条呢?有3个选项 – Lamak

回答

0

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

这将是一种写作SELECT的方式,假定“第一”意味着“最小”。使用此功能来验证它是否给你想要的东西,然后变成一个UPDATE:

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 
+0

首先可能不是最好的单词......我抓住哪条记录并不重要,如果它们符合他们应该都是相同的标准。所以我可以从结果集中抓取任何匹配的结果。 – mrshickadance

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 
相关问题