A表和B表主键都是pk1,pk2,现在我要更新B表,规则:将B表中和A表主键相同的记录更新到A表。我写的是:
UPDATE A T1 SET
(T1.FIELD1,
T1.FILED2
) = (SELECT T2.FILED1,
T2.FILED2
FROM B T2 WHERE T1.PK1 = T2.PK1 AND T1.PK2 = T2.PK2
)
WHERE EXISTS (SELECT 1 FROM A T3 , B T4 WHERE T3.PK1 = T4.PK1 AND T3.PK2 = T4.PK2)
我知道写的有点累赘,刚开始我也怀疑是不是可以去掉外面的where条件,可是当我去掉后再执行时,结果就会出现cant update TI.field2 to null的错误,所以我怀疑可能是因为A 表原有的记录比查出来要更新的记录集多,不加外层where时,去匹配更新记录时会将其余不需要更新的记录更新成默认的NULL,而A.field2为非空,所以才会出现这样的错误?不知道分析得有无道理?请大虾们写出正确的sql来参考参考吧,
UPDATE A T1 SET
(T1.FIELD1,
T1.FILED2
) = (SELECT T2.FILED1,
T2.FILED2
FROM B T2 WHERE T1.PK1 = T2.PK1 AND T1.PK2 = T2.PK2
)
WHERE EXISTS (SELECT 1 FROM A T3 , B T4 WHERE T3.PK1 = T4.PK1 AND T3.PK2 = T4.PK2)
我知道写的有点累赘,刚开始我也怀疑是不是可以去掉外面的where条件,可是当我去掉后再执行时,结果就会出现cant update TI.field2 to null的错误,所以我怀疑可能是因为A 表原有的记录比查出来要更新的记录集多,不加外层where时,去匹配更新记录时会将其余不需要更新的记录更新成默认的NULL,而A.field2为非空,所以才会出现这样的错误?不知道分析得有无道理?请大虾们写出正确的sql来参考参考吧,
set
t1.Field1=nvl( (select t2.Field1 from B t2
where t1.pk1=t2.pk1
and t1.pk2=t2.pk2),t1.field3);搂主的写法 在sqlserver里好像见过
oracle 不清楚
等着达人看有没有办法。
-- update 超过2个值
update customers a -- 使用别名
set (city_name,customer_type)=(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)
"这种写法要SELECT只能返回单条记录"
是正解