仅更新已连接的行

时间:2014-03-25 20:13:54

标签: sql oracle

我试图理解SQL中的update语句。我尝试了许多不同的工作方式,但似乎没有任何工作。我必须连接到表,并且只在连接的行上,我已经将“和”的列文本更新为“是”。

这正是我想要做的。我希望这是有道理的:

update (select t2.text from rules t1 inner join rules t2 on t1.parentid = t2.childid
where t1.parentid > 0 and 
t2.value = to_char (t1.position))
set text = replace(text, 'and', 'is');

我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

如果我的逻辑正确,那么当第二个表中存在id时,您希望在第一个表中进行替换。改为使用where子句:

update table1 
    set text = replace(text, 'is', 'and')
    where exists (select 1
                  from table2 t2
                  where t2.id = table1.id
                 );

我假设条件t2.id > 0是指定匹配的冗余方式。因为两个ID是相同的,我会使用table1.id > 0

update table1 
    set text = replace(text, 'is', 'and')
    where id > 0 and
          exists (select 1
                  from table2 t2
                  where t2.id = table1.id
                 );

答案 1 :(得分:2)

您遇到的第一个问题是,您在table中使用select关键字这是一种错误的语法。

第二个问题是,当您的查询结果set t1.text没有select但是t1.text时,您正在告诉oracle text

此查询有效:

update (select t1.text from t1 inner join t2 
on t1.id = t2.id
where t2.id > 0)
set text = replace(text_val, 'is', 'and');

这是一个有效的fiddle

答案 2 :(得分:1)

可以为此目的使用MERGE语句。

如果您的表具有如下定义的子父关系:

create table t1 (
  id         number, 
  parent_id  number,
  text_field varchar2(100)
)

您可以找到所有匹配的对,然后使用它的唯一标识符搜索要更新的记录:

merge into t1 target_t 
using (
  select 
    parent_tab.id  parent_id,
    child_tab.id   child_id
  from 
    t1 parent_tab,
    t1 child_tab
  where 
    parent_tab.id = child_tab.parent_id

) found_records 
on (
  target_t.id in (found_records.parent_id, found_records.child_id) 
)
when matched 
  then update
    set 
     target_t.text_field = replace(target_t.text_field, 'and', 'is')
;

SQLFiddle