Имитация профсоюза, чтобы сделать промежуточный вид
-
25-09-2019 - |
Вопрос
У меня есть следующая схема таблицы в SQL Server 2005, и я хотел бы денормалировать его в проиндексированном представлении для некоторых запросов, которые я пишу, пока не смогу сделать структурные изменения постоянными.
Таблицы следующие
Writing
(
DocumentSerial int
Grader1_ID int
Grade_1 int
Grader2_ID int
Grade_2 int
Grader3_ID int
Grade_3 int
)
Users
(userID int,
firstname,
lastname
)
Я хочу таблицу с одним ряд для каждого комбинации класса / класса / документов, в котором грейдер является либо грейдером 1, грейдером 2, или Grader 3
Вид, который я написал, использует Union, поэтому он не указан:
select documentSerial,grader1_id as grader_id, grade_1 as grade ,1 as sequence
from Writing w inner join User U on w.grader1_id=u.userid
UNION
select documentSerial,grader2_id as grader_id, grade_2 as grade ,2 as sequence
from Writing w inner join User U on w.grader2_id=u.userid
UNION
select documentSerial,grade31_id as grader_id, grade_3 as grade ,3 as sequence
from Writing w inner join User U on w.grader3_id=u.userid
Проблема в том - SQL не может указать вид с Union ...
Решение
Почему это должно быть проиндексированным представлением, когда вы можете использовать подходящий стол:
SELECT x.*
INTO normalized_table
FROM (select documentSerial,grader1_id as grader_id, grade_1 as grade ,1 as sequence
from Writing w
join User U on w.grader1_id = u.userid
UNION ALL
select documentSerial,grader2_id as grader_id, grade_2 as grade ,2 as sequence
from Writing w
join User U on w.grader2_id = u.userid
UNION ALL
select documentSerial,grade31_id as grader_id, grade_3 as grade ,3 as sequence
from Writing w
join User U on w.grader3_id = u.userid) x
Я понимаю, что вы, вероятно, хотите, чтобы представить, чтобы у вас не было хлопот синхронизации данных. Единственная другая альтернатива - не индексировать вид ...