2016-04-12 7 views
3

は、私はSQL Serverの(2012年)に次の表があるとします。SQL Serverの - 私のデータのマッピング/集合体を作成するための効率的な方法

MyTable: 
Col1: Col2: Col3: Col4: Val1: ... Valn: 
a  b  c  d  123   1234 
.... 

を私はマップするマッピングテーブルを作成するために探しています特定の値に対するCol1 - Col4の特定の値を指定します。以下のように、例えば、それが見える可能性があります。たとえば、最初の行は次のように読み取ることができ、

MyMaps: 
Col1: Col2: Col3: Col4: Label: 
a  <null> <null> d  Label1 
<null> b  <null> d  Label2  

はどこCol1 = MyTableというの任意の行にラベル「のLabel1」を与えます「」 Col4 = 'd'。だから、

、このマッピングを可能にすることができ、私が作成したクエリは次のとおりです。

SELECT 
    MyMaps.Label 
    ,MyTable.Val1 
    ... 
    ,MyTable.Valn 
FROM 
    MyTable 
    INNER JOIN MyMaps 
    ON ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '') 
    AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '') 
    AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '') 
    AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '') 

そして、それは動作しますが、これは、これを達成するための良い方法であるかがあれば場合、私は好奇心が強いですMyTableはかなり大きなテーブルであるため、マッピングを作成する上でより効率的な方法です。

ご意見/ご提案はありますか?

+1

これは一致し、Label1もそうです。どのように正しいラベルを選ぶのですか?また、結合条件に基づいて、COALESCEとISNULLを使用しているため、大きなテーブルではうまく機能しません。 – dfdsfdsfsdf

+1

'MyTable'テーブルの1つの行に対して2つのマップが見つかったらどうなりますか? –

+0

@KMC&Siyavash、良い点。私はこれを他にどのように行うのかという手がかりがなく、私のデータが与えられれば、そうでないと仮定しています....私は真にこの種のマッピングを達成するために他にどのような手がかりを持っていません。 –

答えて

3

は最初のマッチを選択するか、参加する錯体を用いまたはexのためにループやなど)

SELECT 

      t.*, 
      Label = ( 
        --since there can be multiple matches, this is where you apply your rules 
        select top 1 label 
        from MyMaps 
        where ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '') 
         AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '') 
         AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '') 
         AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '') 
        ) 

    FROM MyTable t 

それは小さなテーブルのためだ場合に、複雑なTSQLを書くように、このような行うには複数の方法があり、それは大丈夫です。大きなテーブルの場合、MyTableがMyMapsにマップする方法を定義するマッピングテーブルを作成することができます(名前をMyTableLabelに変更)。挿入操作または更新操作を実行するときにマッピングを計算することができます。

また、MyMapsが事前に参照されている場合(ルックアップテーブル)には、(a、b、c、d、ラベル1)、(null、b、c、null、label2)ヌル、ヌル、ヌル、d、ラベル3)。これにより、MyMapに(null、b、c、null)Label3が含まれているとどうなりますか?この場合、COALESCEとISNULLを使わずに参加できます。

+0

私は覚えています。事前にマッピングを行うことができました。 - 残念ながら、ビジネスユーザーは、Mapsテーブルを使用してルールをかなり動的に定義できるようにすることはできません。私はもっ​​と良いマッピングスキーマ/実装が私はこの1つ以上の合計で使用することができます期待して...それに関する任意のアイデア? –

+1

今のところ私の例のようにサブクエリを使用してください。それは最初の試合を使用します。ビジネスユーザーに複数の一致を処理する方法を尋ねる必要があります。例)ほとんどの列に一致する一致が最初に使用されるべきかどうか?ビジネスユーザーからの要求が増えるにつれて、コードを最適化します。たとえば、クエリが2秒以内に結果を返さなければならないという非機能要件をユーザに与える可能性があります。 – dfdsfdsfsdf

+0

私は、あなたのソリューションが最高であることに同意すると思います - 私はここで雹メアリーをしています。多くのあなたの注意とこの質問に返信! –

関連する問題