2016-11-28 10 views
1

私は、多くのフィールドと1億のデータを持ち、いくつかのフィールドに複合キーを持つテーブルを作成しています。数百万人のうち、いくつかの行のサンプルテーブルEMPを以下に示します。数百万のレコードを持つテーブル内の行のOracle 11g更新

+------+------+------+------+ 
| Col1 | Col2 | Col3 | Col4 | 
+------+------+------+------+ 
| 11 | 21 | 31 | X | 
| 12 | 22 | 32 | X | 
| 14 | 24 | 34 | X | 
| 11 | 21 | 31 | 555 | 
| 11 | 21 | 31 | 551 | 
| 12 | 22 | 32 | 89 | 
| 14 | 24 | 34 | 45 | 
+------+------+------+------+ 

複合キーがCol4からCol1の上にあると仮定します。 Col1、Col2、Col3がグループIdを表しているとします。最初の行はCol4で、Xであるため、Col1 = 11と​​とCol3 = 31のテーブルからすべてのレコードを選択する必要があります。次の行は12,22,32、 'X'なので、Col1 = 11Col2 = 22Col3=32のすべての行を選択する必要があります。そして、すべての場合に同様にCol4 =X

私はカーソル付きのループを使用しようとしましたが、テーブルには1億のデータと複合キーがあるので、時間がかかります。非常に長い時間がかかります。

ループ文の疑似コード私が試した:

result= select Col1,Col2,Col3 from emp where `Col4=X`. 
for each row in result 
do 
    finalresult += select * from table where Col1 = row.Col1 and Col2 = row.Col2 and Col3 = row.Col3 
done 

finalresultを必要なすべてのデータを持っています。しかし、これは非常に長い間実行されています。

はまた、私は

merge into emp t1 
    using (select * from emp t where t.col4=X) t2 
    on t1.col1=t2.col1 
    and t1.col2=t2.col2 
    and t1.col3=t3.col3 
    when matched then update set col4=Y 
and t1.col4!='X'; 

以下のように更新するようにマージを試みた。しかし、これはすべての行を更新していません。

この問題は本当に助かりました。

+1

単純な更新クエリを試しましたか? –

+2

あなたが言ったことは明確ではありません.Col4 = Y、現在のCol4 = Xの行、または他のすべての行を更新する必要がありますか?その後、ループでこれをしないでください。カーソルなどを使用しないでください。完了するまでに2年かかります。ハンマーで熊の葉を試そうとしないでください。ハンマーは釘を動かすことです。レイクはレーキで葉。つまり、UPDATEステートメントを使用します(単純SQL、ループのような手続き型コードの必要はありません)。 – mathguy

+1

私はあなたが示したステートメントが少なくとも2つの理由でコンパイルされることに疑いを持っています( "0行を返す"とはどういう意味ですか?) - まず、col4 = Yを設定することはできません。 = 'Y'、そして最後の行が外れています(あなたはどこにいたのですか... ...そして、そして、t1 ... ...?)それでは、col1-col4はどのようにしてプライマリキーになりますか? col4の値を 'Y'に変更することで重複することになります。構文を有効にしても、主キー制約はほとんどの変更を拒否する必要があります。要件自体は意味をなさない! – mathguy

答えて

0
select * 
    from emp x 
where x.col4 != 'X' 
    and exists (select 1 
       from emp y 
       where x.col1 = y.col1 
        and x.col2 = y.col2 
        and x.col3 = y.col3 
        and y.col4 = 'X') 
関連する問題