我刚加入这个论坛并且已经关注了很长一段时间,确实有一种良好的感觉。 我有一个问题,希望有人能指导我。
我目前的代码。
select *
from T1 join T2 on T1C1 = T2C1 join T3 m on m.C3 = T2C3 join T3 n on n.C3 = T1C3
where m.C4 = 'EXHAUST'
and T1C5 in ('NH', 'CA', 'FL')
我必须更新T1
,设置T1C6 = 'CLEAR'
。
我尝试了各种选项,大多数都遇到了错误。一个工作但是我得到的记录比select语句多四倍。这是我试过的。
update T1, set T1C6 = 'CLEAR' where exists (
select *
from T1 join T2 on T1C1 = T2C2 join T3 m on m.C3 = T2C3 join T3 n on n.C3 = T1C3
where m.C4 = 'EXHAUST' and T1C5 in ('NH', 'CA', 'FL')
)
感谢所有人。
答案 0 :(得分:0)
您的更新查询的问题在于,更新T1与语句中的exists子句没有任何关系,因此您的整个T1表记录更新与内部条件无关。如果内部的任何记录存在条款令人满意,那么它会更新。因此外部T1与内部子查询之间必然存在一些关系(存在)。请在下面找到脚本。我不知道你想要实现什么,但这是怎么回事看起来像。请测试一下。
UPDATE T1 set T1.C6 = 'CLEAR' where exists (
select 1
from T2 ,T3 m,T3 n
where T1.C1 = T2.C2
AND m.C3 = T2.C3
AND n.C3 = T1.C3
AND m.C4 = 'EXHAUST'
AND T1.C5 IN ('NH', 'CA', 'FL')
)
编辑它是一个奇怪的,非优化的解决方案,上面这个解决方案只是为了您的理解。
UPDATE T1 set T1.C6 = 'CLEAR' where T1.rowid IN (
select T1.rowid rd
from T1,T2 ,T3 m,T3 n
where T1.C1 = T2.C2
AND m.C3 = T2.C3
AND n.C3 = T1.C3
AND m.C4 = 'EXHAUST'
AND T1.C5 IN ('NH', 'CA', 'FL'))