2011-06-17 17 views
5

データベースはSQL Server 2008です。1つ以上の表から行を抽出し、それらを表変数に挿入しようとする問合せがあります。重複する表の挿入を防止する

私は私が思い付いたので、何を、重複した挿入を防止するためのefficentの道を希望:

INSERT INTO @MyTableVariable 
SELECT SomeID 
FROM SomeTable st 
INNER JOIN SomeOtherTable sot ON sot.SomeID = st.SomeID 
LEFT JOIN @MyTableVariable t ON t.SomeID = sot.SomeID 
WHERE t.SomeID IS NULL 

これは、しかし、特定のシナリオでの重複挿入を防ぐためには表示されません。

@MyTableVariableの最初の "状態"だけが左の結合操作で使用されているように見えます(このことを考えて、クエリプランを見ると意味があります)。言い換えれば、この文が実行される前に@MyTableVariableにSomeIDがすでに含まれていれば重複を防ぐことができますが、SomeTable/SomeOtherTalbeのFROM/INNER JOINがSomeIDを重複させた場合は重複を防ぎません。

SELECT文でDISTINCTを単に叩くだけでなく、これを処理するもう1つの効率的な方法がありますか?

+0

'DISTINCT'または' GROUP BY'を実行したくない場合は、カラムにユニークなインデックスを作成し、重複したキーを無視することができます。 – Lamak

+0

重複しているキーエラーをどのように無視するのですか?そして、これは実際に別個のものを実行するよりも速いのですか? – RMD

答えて

3

私の知る限りでは、INSERT IGNOREまたはSQL ServerでINSERT ON DUPLICATE KEYの方法がないのに役立ちます。 MERGEですが、INSERTと同じように動作するため、例外が発生するため、問題は解決しません。

これを処理するもう1つのより効率的な方法はありますか?私の見解では

、あなたのオプションは次のとおりです。重複を生じないように参加/フィルタリングのより具体的な方法を見つけるために

  1. 試み。

  2. 最初の場所に結合されているいずれかのテーブルに重複が入るのを防ぐために、 'Slap' DISTINCTはどこか早い段階にあります。

  3. 重複を主に生成するテーブルを、DISTINCTがローカルに適用された副選択に変換します。

重複のない結果セットを生成できない場合は、重複を排除するために(パフォーマンスに応じて)支払う必要があります。それが何であれ、DISTINCT、GROUP BY、または多分ランク付け関数であれば、パフォーマンス上の不利益を招きます。

0

テーブル変数のidカラムにkeyを作成する必要があります。

このような宣言を:

declare @MyTableVariable table(SomeID int identity(1,1) primary key) 

この主キーは重複した挿入を防止します

希望これは

+0

私のテーブル変数にはすでに主キーが指定されています。私は一般的に重複を防ぐ方法を尋ねるのではなく、ソート操作全体を引き起こす別個の節に復元することなく、クエリのパフォーマンスを最適化する方法を尋ねています。 – RMD

関連する問題