Répertorié vue et T-SQL qui donnent même résultat que DISTINCT dans SQL Server 2008 R2
-
11-10-2019 - |
Question
Je veux créer vue indexée MyView avec un tel t-sql
Select
o.Theme_ID as Theme_ID,
DATEADD(day, DATEDIFF(day, 0, o.Object_CreationDate), 0) as Objext_CreationDate,
Count_BIG(*) as ObjectCount, o.Object_Tonality from [dbo].Object o
inner join [dbo].Theme t on o.Theme_ID = t.Theme_ID
inner join [dbo].[ThemeWorkplace] tw on t.Theme_ID = tw.Theme_ID
inner join [dbo].Workplace w on w.Workplace_ID = tw.Workplace_ID
... where t.Theme_DeletedMark = 0
AND (w.Workplace_AccessType = 1 OR w.Workplace_AccessType = 8)
AND Object_DeletedMark = 0 ...
Group BY o.Theme_ID,o.Object_Tonality, DATEADD(day, DATEDIFF(day, 0, o.Object_CreationDate), 0)
Ce t-sql fonctionne très bien et permet de définir un index ordonné en clusters sur MyView .
Le problème est que la table contient ThemeWorkplace
plusieurs enregistrements avec la même Theme_ID
.
Et même je l'utilise GROUP BY
- je reçois en valeur Object_Count
que
est égal à: (valeur réelle de Object_Count
) * comptage (Theme_ID
dans ThemeWorkplace
).
Je ne peux pas utiliser mot DISTINCT
en t-sql, car dans ce cas il est impossible de créer un index sur la vue.
Qu'est-ce qu'une suggestion pour obtenir des résultats corrects à mon avis?
La solution
Comme vous l'avez remarqué, il y a des restrictions importantes sur la création d'une vue indexée. Les techniques qui pourraient vous aider ici, comme distincts ou une sous-requête sont interdits. Je pense que vous aurez besoin de sacrifier la matérialisation de la vue dans ce cas particulier.