2010-11-18 2 views
1

J'ai le schéma de table suivant dans SQL Server 2005 et je voudrais le dénormaliser dans une vue indexée pour certaines requêtes que j'écris jusqu'à ce que je puisse rendre les changements structurels permanents.simuler une union pour créer une vue indexée

Les tables sont les suivantes

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 
) 

Je veux une table avec une seule ligne pour chaque combinaison niveleuse/qualité/document où la niveleuse est soit niveleuse 1, niveleuse 2 ou niveleuse 3

le point de vue que j'ai écrit utilise UNION, donc il ne indexe:

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 

problème est - SQL ne peut pas indexer la vue avec l'union ...

+1

Voulez-vous dire que vous voulez normaliser (au lieu de dénormaliser)? – YWE

+0

Je voulais avoir une structure normalisée temporaire jusqu'à ce que je puisse obtenir les constructions d'application en place pour mettre à jour une table normalisée. Je pensais qu'une vue ferait l'affaire, mais hélas. – Caveatrob

Répondre

1

Pourquoi faut-il être une vue indexée lorsque vous pouvez utiliser une table appropriée:

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 

Je comprends que vous voulez sans doute la vue que vous n'avez pas les tracas de la synchronisation des données. La seule autre alternative est de ne pas indexer la vue ...

+0

Ouais, c'était tout. Peut-être que je vais juste faire la table normalisée et écrire une routine pour la mettre à jour jusqu'à ce que je puisse obtenir l'application mise en place. Merci! – Caveatrob

Questions connexes