2016-12-07 10 views
1

集計クエリに基づいてブール型フラグフィールドを追加しようとしているテーブルがあります。顧客情報を提供せずに、最も単純な形でこれを出ししようとすると、私はフィールドアン、版、Co及び議員とmytableテーブルを呼び出します。Oracle:サブクエリの条件に基づいてフィールドを 'T'に更新します

MyTable 
An  Ver  Co  Rep NewFlag 
A  1  Aa  T  
A  1  Ab  F 
A  1  Ac  T 
B  1  Ba  F 
B  1  Bb  F 
B  1  Bc  T 
C  1  Ca  F 
C  1  Cb  T 
C  1  Cc  F 

を私はNewFlag =「T」を設定したいがAn、Ver、Coのグループ化の場合、Rep = 'T'は1つのみです。それ以外の場合はnullのままです。

Reps = 'T' = 1のカウントを持つAn、Ver、Coを識別するクエリがあり、NewFlagフィールドを更新するために条件として次のような結果サイトを使用したい場合

ように
QueryResults 
An  Ver  Co  
B  1  Bc 
C  1  Cb 

、それはこのようなものになるだろう:

Update MyTable 
Set NewFlag = 'T' 
where 
MyTable.An = QueryResults.An, 
MyTable.Ver = QueryResults.Ver, 
MyTable.Co = QueryResults.Co 

QueryResultsは議員=「T」の唯一の1カウントと、それらのレコードを識別し、私のクエリの結果セットであること。

レコードをループして1つずつ更新するスクリプト以外では、特定のフィールドを更新するためにクエリを挿入できる構文がありますか?

答えて

3

相関サブクエリまたはinが必要です。このような何か:

Update MyTable 
    Set NewFlag = 'T' 
    where (An, Ver, Co) in (select An, Ver, Co 
          from <your query> 
          ); 
+0

私が最初にこの提案を試み、それが働きました。ありがとう! – Tom

0

MERGEこの種の代入のために完全である:

merge into mytable m 
    using (select an, ver, co 
      from  mytable 
      where rep = 'T' 
      group by an, ver, co 
      having count(*) = 1 
     ) x 
    on (m.an = x.an and m.ver = x.ver and m.co = x.co) 
when matched then update set newflag = 'T' 
; 
+0

提案していただきありがとうございます。最初に他の提案を最初に試してみましたが、これはうまくいきましたが、これを行うには複数の方法があるように見えますが、これは素晴らしいことです! – Tom

関連する問題