2

了解しました。データベースに保存する必要のあるテーブルがあります。表の形式は次のとおりです。

Value  | No Deductible | $100 | $250 | $500 |
=============================================
$20000 |          $122 |  $61 |  $28 |  N/A |
$30000 |          $183 | $117 |  $67 |  $44 |

正規化して簡単にアクセスできるようにするために、SQLServerデータベースではテーブルは次の形式になります。

Value (PK)  | Deductible (PK) | Cost |
======================================
     $20000 |              $0 | $122 | 
     $20000 |            $100 |  $61 |  

Valueと列はDeductible共同主キーであり、重複を防ぎます。さらに、特定の控除可能な値のみを許可する制約があります。

現在、この形式はアクセシビリティに最適ですが、データを挿入するのは明らかに簡単ではありません。論理的なフロントエンドを構築する計画はすぐにはないので、このシナリオのビューが理想的です。しかし、簡単に編集できるビューを作成する試みは失敗しました。

1を試す

SELECT 
    t1.Value, t2.Cost AS [No Deductible], 
    t3.Cost AS [$100], t4.Cost AS [$250], t5.Cost AS [$500]
FROM  Valuation AS t1 
INNER JOIN Valuation AS t2 ON t1.Value = t2.Value 
INNER JOIN Valuation AS t3 ON t2.Value = t3.Value 
INNER JOIN Valuation AS t4 ON t3.Value = t4.Value 
INNER JOIN Valuation AS t5 ON t1.Value = t5.Value
WHERE  
    (t2.Deductible = 0) AND (t3.Deductible = 100) 
    AND (t4.Deductible = 250) AND (t5.Deductible = 500)  

複数のベーステーブルを変更できないため、これは機能しません。

2を試す

SELECT Value, 
   (SELECT Cost FROM Valuation WHERE Deductible = 0) AS [No Deductible],
   (SELECT Cost FROM Valuation WHERE Deductible = 100) AS [$100],
   (SELECT Cost FROM Valuation WHERE Deductible = 250) AS [$250],
   (SELECT Cost FROM Valuation WHERE Deductible = 500) AS [$500]
FROM Valuation 
GROUP BY Value

計算列を変更することもできません。

この問題に対するエレガントな解決策はありますか?おそらく組合との何か?私が今持っている唯一の解決策は、控除対象ごとに複数のビューを作成するか、元のテーブルレイアウトを維持するか(値/控除対象キーが他のテーブルで外部キーとして使用されるため、可能性はありますが好ましくありません)、または単に投資することだと思います。テーブルをシミュレートするための論理フロントエンドを作成する時間です(これは、私が言ったように、後で行いたいと思います)。

4

1 に答える 1

1

クエリの最初の別の選択肢は次のとおりです。

Select Value
    , Min( Case When Deductible = '0' Then Cost End ) As [No Deductible]
    , Min( Case When Deductible = '100' Then Cost End ) As [$100]
    , Min( Case When Deductible = '250' Then Cost End ) As [$250]
    , Min( Case When Deductible = '500' Then Cost End ) As [$500]
From Valuation
Group By Value

ただし、これではビューを更新できなくなります。更新可能にする唯一の方法は、ビュー構造に入力された行を正規化されたストレージ形式に再正規化するInstituteOfトリガーを追加することです。

于 2011-04-15T21:24:27.397 に答える