Sql server SQL Server视图-模拟来自规范化源的表

Sql server SQL Server视图-模拟来自规范化源的表,sql-server,view,union,normalize,Sql Server,View,Union,Normalize,好的,我有一个表,我需要存储在数据库中。该表采用以下格式: Value | No Deductible | $100 | $250 | $500 | ============================================= $20000 | $122 | $61 | $28 | N/A | $30000 | $183 | $117 | $67 | $44 | 为了使其规范化并易于访问,SQL Server数据库中的表将采用以下格

好的,我有一个表,我需要存储在数据库中。该表采用以下格式:

Value  | No Deductible | $100 | $250 | $500 |
=============================================
$20000 |          $122 |  $61 |  $28 |  N/A |
$30000 |          $183 | $117 |  $67 |  $44 |
为了使其规范化并易于访问,SQL Server数据库中的表将采用以下格式:

Value (PK)  | Deductible (PK) | Cost |
======================================
     $20000 |              $0 | $122 | 
     $20000 |            $100 |  $61 |  
免赔额
列是一个联合主键,可防止重复。此外,将有一个限制,只允许某些免赔额的价值

现在,这种格式对于可访问性来说是完美的,但显然不容易将数据插入。我目前还没有为它构建逻辑前端的计划,所以在这个场景中的视图是理想的。然而,我试图生成一个可以轻松编辑的视图的尝试失败了

尝试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
您也不能修改计算列


这个问题有一个优雅的解决方案吗?也许是工会的事?我觉得我现在唯一的解决方案是为每个免赔额生成多个视图,保留原始表布局(这是一种可能,但不是首选,因为值/免赔额键在其他表中用作外键),或者只花时间创建逻辑前端来模拟表(正如我所说,我希望以后再做)。

查询的第一个选择是:

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

但是,这将无法使视图可更新。使其可更新的唯一方法是添加一个InsteadOf触发器,该触发器将视图结构中的输入行重新规范化为其规范化存储格式。

如果希望视图可更新,则需要使用
而不是
触发器来实现此功能。示例e在这里