1

我刚加入这个论坛,关注这个论坛已经有一段时间了,感觉确实不错。我有问题,希望有人可以指导我。

我当前的代码。

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')
)

谢谢大家。

4

1 回答 1

0

您的更新查询的问题在于,更新 T1 与语句中的存在子句没有关联,因此您的整个 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'))
于 2012-10-19T09:48:16.453 回答