Question

J'ai une vue qui associe deux tables et est ordonnée par la première table. Sauf que la commande n'est pas correcte. Il manque un enregistrement occasionnel, puis à la fin, la plupart de ces enregistrements existent dans l’ordre, et à cette fin, le reste des enregistrements existe dans l’ordre. Donc, il a des enregistrements tels que

1  (most of the records in order)
2
4
5
6
7
8
10
11
13
15
3  (the first set of missing records)
12
9 (the rest of the missing records)
14

Mon avis est ci-dessous. Dois-je faire la commande avant de faire la jointure? Qu'est-ce que je fais mal? (J'ai acquis cette vue et la même vue dans une autre instance de base de données fonctionne correctement.)

CREATE VIEW [dbo].[SampleView]
AS
SELECT     TOP 100 PERCENT blp.*, ISNULL(YEAR(DATEADD(month, 2, tb.[End of D&D])), 0) AS DEMO_FY
FROM         dbo.Table1 AS blp LEFT OUTER JOIN
                      dbo.Table2 AS tb ON blp.FACIL_NAME = tb.[Structure ID]
ORDER BY blp.ID

(edit) Le type du champ de tri est [ID] [int] IDENTITÉ NON NUE (1, 1),

Était-ce utile?

La solution

Lire Créez une vue triée dans SQL Server 2005 et SQL Server 2008 . Il existe un correctif logiciel et vous devez exécuter le mode de compatibilité 2000 pour que cela fonctionne. Pourquoi ne pas simplement faire la commande en sélectionnant dans la vue?

Autres conseils

Je supprimerais entièrement la clause ORDER BY de la vue. Indiquez plutôt votre commande au moment où vous interrogez la vue.

Un commentaire dans ceci l'entrée dans le blog est très claire.

Encore une fois le texte de BOL:

  

"Lorsque ORDER BY est utilisé dans la définition d'une vue, d'une fonction inline, d'une table dérivée ou d'une sous-requête, la clause est utilisée uniquement pour déterminer les lignes renvoyées par la clause TOP. La clause ORDER BY ne garantit pas les résultats ordonnés lorsque ces constructions sont interrogées, à moins que ORDER BY ne soit également spécifié dans la requête elle-même. "

     

" Bien que la définition de la vue contienne une clause ORDER BY, cette clause ORDER BY n'est utilisée que pour déterminer les lignes renvoyées par la clause TOP. Lors de l'interrogation de la vue elle-même, SQL Server ne garantit pas que les résultats seront ordonnés, à moins que vous ne le spécifiiez explicitement, comme indiqué dans la requête suivante:

SELECT * FROM TopView
ORDER BY LastName

"

Les deux serveurs SQL sont probablement des versions légèrement différentes. Il existe un correctif connu pour cela:

http://support.microsoft.com/kb/926292/

Vous devez toujours "commander". au dernier point possible, car le tri est lent (N log N). Lorsque vous effectuez une sélection sur une vue, vous incluez généralement une clause where. Vous voulez seulement trier cet ensemble de résultats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top