我正在尝试使用下面的查询在一个包含现有表的表上运行更新。代码列记录需要更新,但只需更新其中一些。我的查询似乎工作,但任何应该留在代码列中的记录最终都被设置为NULL。如何修改此查询以保持这些记录不变?
查询
update t1 x
set x.code =
(select code from
(select distinct address, city, prov, aflag, rcode from t2) y
where x.address = y.address and x.city = y.city and x.state = y.state and x.flag = y.flag)
where x.aflag like '%b%';
表1:要更新的代码
t1
address city state flag code
123 aaa il b 400
567 bbb il b 400
345 bbb il b -500
789 ddd il b 600
546 ccc il b 700
表2:用于更新T1的代码列
t2
address city state flag code
123 aaa il b -555
444 bbb il b -555
345 bbb il b -555
888 kkk il b -555
546 ccc il b -555
What the query currently outputs
current output
address city state flag code
123 aaa il b 400
444 bbb il b NULL
345 bbb il b -500
888 kkk il b NULL
546 ccc il b -700
我希望查询保持记录不受更新表的匹配,如下所示
What I want
address city state flag code
123 aaa il b 400
444 bbb il b -555
345 bbb il b -500
888 kkk il b -555
546 ccc il b -700
谢谢!
答案 0 :(得分:1)
最好的方法是在exists
子句中使用where
:
update t1 x
set x.code = (select code
from t2 y
where x.address = y.address and x.city = y.city and x.state = y.state and x.flag = y.flag and rownum = 1
)
where x.aflag like '%b%' and
exists (select code
from t2 y
where x.address = y.address and x.city = y.city and x.state = y.state and x.flag = y.flag and rownum = 1
);
答案 1 :(得分:1)
t2
都会告诉您要更新哪些行以及使用哪个值。为此,请编写一个可更新的查询:
update
(
select t1.code, t2.code as new_code
from t1
join t2 on t2.address = t1.address
and t2.city = t1.city city
and t2.state = t1.state
and t2.flag = t1.flag
where t1.flag like '%b%'
)
set code = new_code;
为了实现这一点,address, city, state, flag
中的t2
必须是唯一的,因此DBMS知道它正好使用更新数据获得一条记录。
对于您想要更新多个列的情况,可更新查询尤其有用。
答案 2 :(得分:0)
MERGE INTO t1 x
USING (SELECT DISTINCT address, city, state, flag, code from t2) y
ON (x.address = y.address AND x.city = y.city AND x.state = y.state AND x.flag = y.flag)
WHEN MATCHED THEN
UPDATE SET x.code = y.code
WHERE x.flag LIKE '%b%';