2013-04-18 7 views
-2

Я пробовал искать эту тему здесь, но не нашел ответа ... Во всяком случае, моя цель - обновить таблицу (назовем ее t_item), в частности column owner_id со значениями в зависимости от другой table (t_item_geo, которая в свою очередь связана с t_geo).Oracle SQL update

Я не совсем уверен, действительно ли синтаксис ниже для операторов обновления.

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') 
);  

Во всяком случае, моя проблема с этим запросом является то, что он обновляет гораздо больше строк, чем она должна - если отделить только оператор выбора Oracle возвращает ~ 750 строк, но udpate сам обновляет более 4000 строк. Это почти так, как если бы состояние было полностью проигнорировано, что указывало бы мне на неправильный синтаксис.

Мне нужно обновить определенное значение в таблице на основе выбора из нескольких других «соединенных» таблиц. Надеюсь, это имеет смысл.

Спасибо за любой вклад!

ОБНОВЛЕНИЕ: извините - возможно, это было непонятно из самого вопроса, но правильное количество отредактированных элементов должно быть ~ 750, а не ~ 4000. Благодаря!

+0

это должно работать - даже я F находит подвыборку имеет 750 строк, не может быть 4000 в таблице t_item, которые соответствуют этим идентификаторам – Randy

+0

Я согласен с Рэнди, если owner_id не PK (или уникальный столбец) в этой таблице может быть много строк, которые соответствуют этим 750 идентификаторам – JordanBean

+0

Ну, вы можете использовать [скрипку] (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;