2015-05-14 71 views
0

我試圖在滿足以下條件時更新我的​​表(位置),將字段「NO_SHIP」設置爲「Y」。請幫助,謝謝!更新有多個表的表字段

這是到目前爲止我的代碼:

UPDATE LOCATIONS l 

SET l.NO_SHIP='Y' 

Where ARINVT.ID = FGMULTI.ARINVT_ID And FGMULTI.LOC_ID = L.ID 

And ((FGMULTI.LOT_DATE + ARINVT.SHELF_LIFE) - SysDate)/ARINVT.SHELF_LIFE < .8 

And L.LOC_DESC <> 'NC0101' 

And ARINVT.CLASS = 'FG' 

And L.ID <> 27051 

回答

0

不能在update本身加入,沒關係隨意介紹給其他表的引用。您需要使用關聯的子查詢來標識要更新的行。喜歡的東西:

UPDATE LOCATIONS L 
SET L.NO_SHIP = 'Y' 
WHERE L.LOC_DESC <> 'NC0101' 
AND L.ID <> 27051 
AND (
    SELECT MIN(((F.LOT_DATE + A.SHELF_LIFE) - SysDate)/A.SHELF_LIFE) 
    FROM FGMULTI F 
    JOIN ARINVT A ON A.ID = F.ARINVT_ID 
    WHERE F.LOC_ID = L.ID 
    AND A.CLASS = 'FG' 
) < .8 

相關的是,子查詢是指L.ID從外部更新語句。

當然,完全未經測試,因爲我們沒有您的表格定義或樣本數據。希望這會指出你在正確的方向。 (編輯在子查詢中添加聚合函數,所以它只返回一行)。

或者你可以在子查詢中檢查是否有匹配的行存在:

UPDATE LOCATIONS L 
SET L.NO_SHIP = 'Y' 
WHERE L.LOC_DESC <> 'NC0101' 
AND L.ID <> 27051 
AND EXISTS (
    SELECT null 
    FROM FGMULTI F 
    JOIN ARINVT A ON A.ID = F.ARINVT_ID 
    WHERE F.LOC_ID = L.ID 
    AND A.CLASS = 'FG' 
    AND ((F.LOT_DATE + A.SHELF_LIFE) - SysDate)/A.SHELF_LIFE < .8 
); 

你也可以有子查詢包括它自己的locations副本加入到其他兩個表,找到相關標識;然後讓更新使用in子句更新與這些ID匹配的行。您可能想要檢查每種方法的性能。

基於您的評論,你實際上要更新fgmulti,並且因爲沒有arinvtlocations之間從你出什麼明顯的直接聯繫,你可以使用像這樣的方法:

UPDATE FGMULTI 
SET NO_SHIP = 'Y' 
WHERE LOC_ID IN (
    SELECT F.LOC_ID 
    FROM FGMULTI F 
    JOIN ARINVT A ON A.ID = F.ARINVT_ID 
    JOIN LOCATIONS L ON L.ID = F.LOC_ID 
    WHERE L.LOC_DESC <> 'NC0101' 
    AND L.ID <> 27051 
    AND A.CLASS = 'FG' 
    AND ((F.LOT_DATE + A.SHELF_LIFE) - SysDate)/A.SHELF_LIFE < .8 
); 

子查詢可以獨立運行以查找需要更新的所有行;然後IN僅將更新應用於這些更新。我們仍然沒有表格結構或關係,所以我只是從你提到的專欄開始;這意味着子查詢找到的所有fgmulti行都會被更新。這可能太廣泛了。如果fgmulti有它自己的主鍵,請使用它:

UPDATE FGMULTI 
SET NO_SHIP = 'Y' 
WHERE ID IN (
    SELECT F.ID 
... 
+0

謝謝你的幫助!我結束了運行,但現在得到以下:一般SQL錯誤。 ORA-01427:單行子查詢返回多個行 手動SQL語句 - >已完成1個錯誤。你有什麼想法? –

+0

@MarkStevens - 對,我應該在子查詢中包含一個聚合函數,以便它有一個值。你似乎在尋找*任何小於0.8的值,所以我使用了'min()'。我還添加了一個「存在」版本,它可以做同樣的事情,但一旦找到匹配就會停下來。 –

+0

第二個實際上效果很好。不幸的是,FGMULTI和LOCATIONS都有一個「NO_SHIP」字段,我在使用LOCATIONS時是不正確的。我需要更新FGMULTI.NO_SHIP。到目前爲止,我一直在努力修改你的代碼,但沒有運氣。不過謝謝你,你一直非常樂於助人! –

相關問題