2016-07-12 37 views
0

source_tbl: EMAIL_ADDR、役割選択サブクエリのクエリ結果セットが、T-SQLインサートで静的に選択されていますか?

target_tbl: EMAIL_ADDR、役割

source_tblは、多くの電子メールアドレスを持つことができます。 ( - ちょうどFYI source_tblにおける役割がtarget_tblにおける役割に統合される)

私の関心は、(何の制約がdbaセットアップによって所定の位置にありません)

target_tblにメールアドレスを複製していない target_tblは、1つの異なる電子メールアドレスを持つことができます私は、Insert into Select内のサブクエリが一度実行され、その結果セットがInsertによって使用されるという疑いがあります。このような場合は、このようなクエリでは動作しません。

insert into target_tbl 
(email_addr, roles) 
select 
src.email_addr, 
src.role 
from source_tbl src 
where src.email_address not in (select email_addr from target_tbl) 

は、誰かが私にこの確認

を与える文書に私を指すことができるかどうかを確認、私の疑念を確認何かを見つけることができません
+1

ロールについて少し説明してください。私はあなたが1行の関係に多くの行を取ることになる他のいくつかのソリューションをピボットし、マージすることができるかもしれないと思う。あなたの質問にサンプルデータを提供して、あなたのために答えを狙うことができますか?ヒント:実行計画を見て、行単位でループするか、target_tblから単一のルックアップを実行するかを確認することもできます。私はこの質問がRBARではないと思う。 –

+0

あなたは自分でテストすることで簡単に確認できる何らかのドキュメントが必要なのはなぜですか? –

+0

ピボットリードに感謝します。それは私の最初の質問@MattAの後に出てくる別の問題でした。 – mmv1219

答えて

1

次のサブクエリが各行に対して再評価されるかどうかを尋ねるので、以前に同じステートメントで追加された電子メールアドレスを考慮に入れますか?

where src.email_address not in (select email_addr from target_tbl) 

もしそうなら、答えは "いいえ"です。

Halloween Protectionの結果として開始時に評価され、スプールされます(SQL Serverがスプールなしでこれらのセマンティクスを保証する計画を立てない限り、回答は同じです)。

SELECTクエリで[email protected]の3行が返され、その電子メールアドレスがターゲットテーブルに存在しない場合は、3行すべてが挿入されます。

あなたは電子メールあたりSELECTだけ選ぶための1行を変更したり、単に最初に遭遇する(任意)1を維持するためにignore_dup_keyで、テーブルに一意性制約を追加することができます。最初のオプションは、どのオプションが保持されているかを制御できるため、より便利です。

+0

ありがとう、それは私が必要なものです – mmv1219

関連する問題