2017-06-27 11 views
0
SELECT l.CKey, 
     wl.LKey, 
     l.AKey, 
     l.LKey 
     FROM table1 l 
     INNER JOIN DatabaseServer.Table2 wl 

     ON l.CKey = wl.CKey 
     WHERE LKey NOT IN (select LKey from DatabaseServer.Table3 wc 
     where wc.LKey = wl.LKey and wc.AKey = l.AKey) 

私は上記のクエリを持っており、テンポラリテーブルとのクロスデータベースサーバジョインを削除したいと考えています。あなたは、私は、クロスデータベースサーバを取り除くことができる方法を教えてくださいすることができデータベーステーブルの削除テンポラリテーブルとの結合

+0

一時テーブルにデータをロードし、代わりにそのテーブルを使用します。 –

+0

@ GordonLinoff上記のクエリのクエリを書くことはできますか? これには2つのデータベースサーバーテーブル結合があります。したがって、2つの一時テーブルが必要です。また、必要な行のみを一時テーブルにロードするにはどうすればよいですか。 –

+0

DatabaseServer.Table2から#tempTableにLkeyを選択します。データベースサーバーの代わりに#tempTableを使用するようにクエリを調整します。 Ps:Table2にはいくつのレコードがありますか? –

答えて

1
select * 
into temptable 
from DatabaseServer.Table2 
WHERE DatabaseServer.Table2.Ckey in (select Ckey from table1) 


select * 
into temptable2 
from DatabaseServer.Table3 
WHERE DatabaseServer.Table3.AKey not in (select AKey from table1) 


SELECT l.CKey, 
     wl.LKey, 
     l.AKey, 
     l.LKey 
     FROM table1 l 
     INNER JOIN temptable wl 

     ON l.CKey = wl.CKey 
     WHERE LKey NOT IN (select LKey from temptable2 wc 
     where wc.LKey = wl.LKey and wc.AKey = l.AKey) 

EDITに参加する:あなたはフィルタ一時テーブル内のデータが必要な場合は、単にWHERE SELECT INTOクエリに追加します。問題は、フィルターの複雑さです。

EDIT2:一時テーブルを作成する作業に役立つフィルタを追加しました。これにより得られるデータの量に応じて、クエリ自体を実行する前にテンポラリテーブルにインデックスを作成することができます。

+0

私は同じクエリを持っていますが、テーブル1の任意のキーを使ってテンポラリテーブルのデータをフィルタリングできますか?クロスデータベースサーバが再び参加することはありません。 表2と表3には大量のデータがあり、フィルタリングはtable1のキーに依存します –

+0

WHERE条件を追加した更新クエリを参照してください。しかし、あなたのCKeyとAKeyが十分に選択的でない場合、超高速応答は期待しないでください。パフォーマンスがどんなに良いかは分かりませんが、元のソリューションよりも速くなることを願っています。ちょうど試しと測定を与える。 –

+0

私が正しくそれを思い出すと、私の同僚は何か類似していて、パフォーマンスのキー・キラーはTable2とTable3の間の結合です。同じサーバー上にあっても、元のクエリでローカルサーバーに参加します。 –

関連する問題