我试图理解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');
我非常感谢你的帮助。
答案 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')
;