2013-04-18 112 views
-2

我試過在這裏搜索這個特定的主題,但還沒有找到答案...無論如何,我的目標是更新表(我們稱之爲t_item),具體地說,列owner_id與值取決於另一個表(t_item_geo,然後鏈接到t_geo)。Oracle SQL更新

我不完全確定下面的語法是否對更新語句實際有效。

UPDATE t_item SET owner_id= 6993 WHERE t_item.owner_id in 
(SELECT t_item.owner_id FROM 
t_item, 
t_item_geo, 
t_geo 
WHERE 
t_item.id = t_item_geo.item_id and 
t_item_geo.geo_id = t_geo.id and 
t_item.owner_id in (SELECT id FROM t_user WHERE network_id='fffffff') and 
t_geo.id in (SELECT id FROM t_geo WHERE full_name = 'yyyyyyy') 
);  

不管怎樣,我與此查詢的問題是,它更新比它應該更行 - 如果我只是分開的select語句Oracle返回〜750行,但UDPATE本身更新超過4000行。這幾乎就像條件完全被忽略 - 這會指向我可能不正確的語法。

我需要根據從其他幾個「連接」表中選擇來更新表中的特定值。希望它是有道理的。

感謝您的貢獻!

更新:對不起 - 也許這個問題本身並不明確,但編輯的項目的正確數量應該是〜750而不是〜4000。謝謝!

+0

這應該工作 - 即使我fthe子查詢中有750行,有可能是4000匹配的IDS – Randy

+0

我與蘭迪同意,如果owner_id不是PK的t_item表(或一個唯一的列),可能有很多行匹配那些750個標識符 – JordanBean

+0

那麼,您可以使用[fiddle](http://www.sqlfiddle.com)並查明它是否有效。 – hd1

回答

1

試試這個

MERGE INTO t_item 
USING 
(
    SELECT t_item.owner_id FROM 
    t_item, 
    t_item_geo, 
    t_geo, 
    t_item.rowid rowid_sub 
    WHERE 
    t_item.id = t_item_geo.item_id and 
    t_item_geo.geo_id = t_geo.id and 
    t_item.owner_id in (SELECT id FROM t_user WHERE network_id='fffffff') and 
    t_geo.id in (SELECT id FROM t_geo WHERE full_name = 'yyyyyyy') 
) on (rowid = rowid_sub) 
WHEN MATCHED THEN 
UPDATE SET owner_id= 6993;