2013-09-26 39 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 
相關問題