2011-01-17 10 views
0

私はsourceテーブルをクエリする動的クエリ文字列を作成するために使用しているcriteriaテーブルのレコード内に保存された条件を持っており、そのクエリの結果はdestinationテーブルに挿入されます。私の目標は、sourceテーブルのレコードと条件が一致した場合は、テーブルのIDをdestinationテーブルに挿入することです。複数の条件レコードが一致する場合は、最初のレコードを挿入します。レコードを選択したORステートメントを決定しますか?

句はOR接続によってセクションの数と共に、各セクション内の条件に内蔵されているザが一緒をAND演算されます。以下のような何か:

insert into destinationTable(col1, col2, col3) 
select col1, col2, col3 
from sourceTable 
where 
--' begin generated code' 
    (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1' 
or (d = 'asdf' and e = 3.43) -- 'from criteria record 2' 
or (f = 234523 and g = 9823742) -- 'from criteria record 3' 
etc... 
--' end generated code' 

私が基準と一致したことを第1のOR部分であるかを決定し、これを行うことができますどのように先テーブル内の対応する基準IDを挿入する方法を見つける必要がありますか?

答えて

7

あなたは出力が第1のOR句成功しますSELECT句の場合ステートメントを含めることができます

Select ... 
    , Case 
     When a = 525 And b = 324 And C = 4523 Then Criteria_Row_1_Pk 
     When d = 'asdf' and e = 3.43 Then Criteria_Row_2_Pk 
     .... 
     End As SuccessClausePk 
4

を交換するか、労働組合によっておよび基準番号に

select col1, col2, col3, 1 
from sourceTable 
where 
--' begin generated code' 
    (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1' 
union all 
select col1, col2, col3, 2 
from sourceTable 
where (d = 'asdf' and e = 3.43) -- 'from criteria record 2' 
union all 
select col1, col2, col3, 3 
from sourceTable 
where (f = 234523 and g = 9823742) -- 'from criteria record 3' 
etc... 
を与える列を追加
+1

ニースであることが十分に一致しているが、これは先のテーブルに重複したレコードを作成できませんでしたか? – adam0101

+0

subqueryそれを選択し、col1、col2、col3、min(which)from(select col1 ...、1 from ... union ...)サブクエリグループcol1、col2、col3のようなMin(lastcolumn) – RichardTheKiwi

+0

UNION ALLをUNIONに変更して別のクエリを実行することもできますが、他のソリューションと同じくらい効果的かどうかは疑問です。 – adam0101

2

全範囲の列に対応できるインデックスが存在しない場合を除き、テーブルが完全にスキャンされる可能性があります。すべてのレコードを調べているので、のフィルタを実行する前に、の判断を行うこともできます。

SELECT col1, col2, col3, Which 
FROM 
(
    select col1, col2, col3, 
    CASE 
    --' begin generated code' 
    WHEN 
     (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1' 
    THEN 1 
    WHEN 
     (d = 'asdf' and e = 3.43) -- 'from criteria record 2' 
    THEN 2 
    WHEN 
     (f = 234523 and g = 9823742) -- 'from criteria record 3' 
    THEN 3 
    --' end generated code' 
    END Which 
    from sourceTable 
) SQ 
WHERE Which is not null -- remove where it didn't match any criteria 

フォームが予測可能とコード生成優しい

+0

面白い、私はCASEステートメントの基準を繰り返さなければならないと思ったWHERE句。私はこれがうまくいくかどうかを知りたいと思うでしょう。 – adam0101

+0

@cyberwikiソーステーブルにインデックスがあり、クエリには常にこのインデックスを使用する基準が少なくとも1つ含まれます。この方法はまだ実行可能であると思いますか、またはWHERE句の基準を繰り返す必要がありますか? – adam0101

+0

SQL Serverに関してはクリスタルボールはありません。パフォーマンスはあらゆる種類の理由によって常に変化するため、すべてのクエリをテストして最適なものを確認します。インデックスを使用できない他の基準があり、クエリにはすべての条件をチェックする必要があるため、「このインデックスを使用する少なくとも1つの基準」はスキャンを防止するのに十分ではありません。 – RichardTheKiwi

関連する問題