2017-03-06 10 views
2

多対多リレーションシップのジャンクションテーブルに値を追加しようとしています。別の(一意の)フィールドを持つ複数のテーブルのプライマリIDを参照

テーブル(すべてのIDは整数である)これらのように見える:

+------+----------+ 
| id_A | ext_id_A | 
+------+----------+ 
| 1 | 100 | 
| 2 | 101 | 
| 3 | 102 | 
+------+----------+ 

表Bが概念的に類似している

+------+----------+ 
| id_B | ext_id_B | 
+------+----------+ 
| 1 | 200 | 
| 2 | 201 | 
| 3 | 202 | 
+------+----------+ 

表PKがID_A及びID_Bであります、私の接合テーブルの列はそれらの列にFKですが、私は値を挿入する必要があります外部ID(ext_id_A、ext_id_B)。

外部IDは一意の列なので、テーブルID自体が1:1であるため、ext_idを持つことで正確な行を検索してIDを取得して接合テーブルに挿入する必要があります。

これは私がこれまで行ってきたが、最適化されたSQL文のように見えないものの例である:

-- Example table I receive with test values 
declare @temp as table (
    ext_id_a int not null, 
    ext_id_b int not null 
); 

insert into @temp values (100, 200), (101, 200), (101, 201); 

--Insertion - code from my sp 
declare @final as table (
    id_a int not null, 
    id_b int not null 
); 

insert into @final 
select a.id_a, b.id_b 
from @temp as t 
inner join table_a a on a.ext_id_a = t.ext_id_a 
inner join table_b b on b.ext_id_b = t.ext_id_b 

merge into junction_table as jt 
using @final as f 
on f.id_a = jt.id_a and f.id_b = tj.id_b 
when not matched by target then 
insert (id_a, id_b) values (id_a, id_b); 

私のストアドプロシージャは、Aのデータを受信するので、私はMERGE文を考えていましたTable Value Parametersパラメータを使用して、既存の参照をチェックする必要があります。

これらの値の挿入を改善するために何かできますか?

+1

彼らはええ、私は知っている..私はこれらのテーブルを作成していないが、私は自分の道を見つけなければならない学校 – IsuruKusumal

+0

で正規化についてお教え理由ですとにかく外に – Andrea

+0

あなたのアプローチの問題は何ですか? –

答えて

1

@finalテーブル変数を使用する必要はありませんが:

; with cte as (
    select tA.id_A, tB.id_B 
    from @temp t 
    join table_A tA on t.ext_id_a = tA.ext_id_A 
    join table_B tB on t.ext_id_B = tB.ext_id_B 
) 
merge into junction_table 
using cte 
on cte.id_A = junction_table.id_A and cte.id_B = junction_table.id_B 
when not matched by target then 
insert (id_A, id_B) values (cte.id_A, cte.id_B); 
+0

誰も答えておらず、良いアドバイスと思われるので、私はあなたの答えを受け入れます。私はテンポラリテーブルとcteの違いを知らなかったので、とにかくお礼します。 – Andrea

+1

はい、CTEは重要なコンセプトです。再帰的なCTEを見てみると、彼らは非常に強力です。私の答えは、これがあなたが達成したかったものであることを望みます...気をつけてください! –

関連する問題