0

新しいスキーマと古いスキーマを一致させるために、より良い方法で実行できると思われるいくつかの醜いゆがみを実行する必要があります。参考までに、この照合プロセスについて別の質問をしました:関連する子テーブルからのビューの作成

SQLFiddleに簡略化された例を配置しましたが、その要点は、これらの 2 つの異なるスキーマを調整する唯一の方法は、同じ値に対して 2 つの case ステートメントを実行することです。次のようになります。

SELECT 
    CASE 
        WHEN n.FooBarStatusId = 1 OR n.FooBarStatusId = 2 
            THEN 1 
        ELSE 0 
    END as [IsFoo],
    CASE
        WHEN n.FooBarStatusId = 2
            THEN 1
        ELSE 0
    END as [IsBar]
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

同じことを達成するためのより良いおよび/またはより効率的な方法はありますか? これらの case ステートメントは、特定のクエリで何百回もヒットする可能性があり、この特定のロジックが心配です。

この特定のロジック (ビューを構築するためのより大きなクエリの一部) を一時テーブルまたはおそらくテーブル値関数に抽出することを考えましたが、それでも使用する方法を思いつくことはできません複数の case ステートメント。

4

2 に答える 2

1

文法を直しただけ...

別の解決策を見つけました:

select 
 p.Name,
 ISNULL(o.IsFoo, CONVERT(BIT, n.FooBarStatusId)) as [IsFoo],
 ISNULL(o.IsBar, CONVERT(BIT, n.FooBarStatusId * (n.FooBarStatusId - 1))) as [IsBar],
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

唯一の算術ソリューションは遅くなる可能性があります。

select 
 p.Name,
 ISNULL(o.IsFoo, CAST( (n.FooBarStatusId % 0.35) * 4 AS int)) AS [IsFoo],
 ISNULL(o.IsBar, n.FooBarStatusId/2) [IsBar]
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

個人的には、浮動小数点演算が含まれる可能性があるため、除算を使用するのは好きではありません。そうすると、非常に遅くなります。

于 2014-01-24T00:41:04.987 に答える