2016-10-27 7 views
-1

高速な方法で、別のテーブルから列を追加するためのクエリなので、(私は更新を試してみましたが、それは非常に遅いです)私はややSQLが来る初心者の午前

私が持っている、次のように私の問題のための助けが必要テーブルA(6.5ミルのレコード)で、カラム(Y)にテーブルBの値(2.5 milレコード)を(共通の)カラムの条件で追加したいとします。X AX = BX

B doesn Aが持つすべてのX値を持っています。

また、Xは、Xはまた、値が存在する場合X = 10、Y = 5とすることがなく、決して意味

が重複している、但しYの重複値のためではなく、一意の値を行いX = 10、Y = 15(Yが同様に重複する値を持つことになります)

追加情報は、私はAX < 0(およびAX = BX)

答えて

0
  1. は実際を書くだけYからすべての値を追加する必要がいけない 関連している可能性がありますで必要なものを返すSELECTテーブル。重複については、 "distinct select"を実行して、出力から 重複を削除することができます。
  2. が書いた選択に基づいてVIEWを作成します。 選択を共有する必要がある場合はテーブルを作成する必要はありません。ビューはより効率的です。 より柔軟性があります。
0

私は..あなたが最も単純なケースである。この

alter table A add(Y NUMBER); 

update A set Y = (select distinct Y from B where A.X = B.X) 
where A.X < 0; 

ような何かをしようとしたと仮定し、相対10millions行が小さいイマイチで「遅いです」。しかし、フルテーブルスキャンを防ぐためにB.Xのインデックスが必要なことがあります。必要に応じて後で再び取り外すことができる。

+0

あなたはB(Xではない)からYを選択しましたか?そして、あなたは 'A.X <0'のときだけアップデートを行うべき部分を見逃したようです。 – mathguy

+0

おそらく..これを反映するためにこの答えを更新しました。 – ShoeLace

0

最初に列yをテーブルaに追加してください(おそらくすでに行っているかもしれません)。

次に、別の( "ソース")テーブルのデータでターゲットテーブルを更新する場合、mergeステートメントは、多くの場合、updateより優れています。 1つのステートメントですべての更新、挿入、削除が行われている場合がありますが、時にはそれが遅い場合もあります(遅くならない場合もあります)。updateそれが置き換えられる他のステートメント

このような何か:

merge into a 
    using (select distinct x, y from b where x < 0) g 
    on (a.x = g.x) 
when matched then update 
    set a.y = g.y 

注誰もがすでに指摘したように、あなたはサブクエリ最初gselect distinctなければならないこと。テーブルbから直接更新することはできません。

関連する問題