Представления 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 |  

Столбцы 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

Вы также не можете изменять вычисляемые столбцы.

Есть ли элегантное решение этой проблемы? Может что-то с союзами? Я чувствую, что единственными решениями, которые у меня есть сейчас, являются создание нескольких представлений для каждой франшизы, сохранение исходного макета таблицы (возможно, но не предпочтительно, поскольку ключ значения/франшизы используется в качестве внешнего ключа в других таблицах) или просто инвестировать времени на создание логического внешнего интерфейса для имитации таблицы (что, как я уже сказал, я бы предпочел сделать позже).


person Lucas B    schedule 15.04.2011    source источник
comment
Вам понадобится триггер INSTEAD OF, чтобы реализовать это, если вы хотите, чтобы представление было обновляемым. Пример здесь сводная таблица доступна только для чтения, и ячейки нельзя редактировать"> stackoverflow.com/questions/5011944/   -  person Martin Smith    schedule 16.04.2011


Ответы (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

Однако это не позволит обновлять представление. Единственный способ сделать его обновляемым — добавить триггер BeforeOf, который повторно нормализует введенные строки в структуре представления до их нормализованного формата хранения.

person Thomas    schedule 15.04.2011