Представления SQL Server - имитация таблицы из нормализованного источника - PullRequest
2 голосов
/ 16 апреля 2011

Хорошо, у меня есть таблица, которую мне нужно сохранить в базе данных. Таблица в следующем формате:

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

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

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

1 Ответ

1 голос
/ 16 апреля 2011

Первый вариант запроса:

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

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

...