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'

さまざまなオプションを試しましたが、ほとんどのオプションでエラーが発生しました。1つは機能しましたが、selectステートメントの4倍のレコードが更新されました。これが私が試したことです。

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

更新クエリの問題は、ステートメントのexists句と更新T1の相互関係がないため、T1テーブルレコード全体が内部の条件に関係なく更新されることです.exists句内のレコードのいずれかが満足している場合、それから更新されます。したがって、外側の T1 と内側のサブクエリ (Exists) の間に何らかの関係があるに違いありません。スクリプトの下にあるものを見つけてください。これをテストしてください。

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 に答える