不能在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
,並且因爲沒有arinvt
和locations
之間從你出什麼明顯的直接聯繫,你可以使用像這樣的方法:
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
...
謝謝你的幫助!我結束了運行,但現在得到以下:一般SQL錯誤。 ORA-01427:單行子查詢返回多個行 手動SQL語句 - >已完成1個錯誤。你有什麼想法? –
@MarkStevens - 對,我應該在子查詢中包含一個聚合函數,以便它有一個值。你似乎在尋找*任何小於0.8的值,所以我使用了'min()'。我還添加了一個「存在」版本,它可以做同樣的事情,但一旦找到匹配就會停下來。 –
第二個實際上效果很好。不幸的是,FGMULTI和LOCATIONS都有一個「NO_SHIP」字段,我在使用LOCATIONS時是不正確的。我需要更新FGMULTI.NO_SHIP。到目前爲止,我一直在努力修改你的代碼,但沒有運氣。不過謝謝你,你一直非常樂於助人! –