Domanda

Ho una vista che unisce due tabelle e ordina per la prima tabella. Solo che l'ordine non è corretto. Manca un record occasionale, e poi alla fine, la maggior parte di quei record esiste in ordine, e quindi a quel fine, il resto dei record esiste in ordine. Quindi ha record come

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

La mia vista è sotto. Devo fare l'ordine prima di unirmi? Che cosa sto facendo di sbagliato? (Ho acquisito questa vista e la stessa identica vista in un'altra istanza di db funziona correttamente.)

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

(modifica) Il tipo per il campo di ordinamento è [ID] [int] NOT NULL IDENTITY (1, 1),

È stato utile?

Soluzione

Leggi Crea una vista ordinata in SQL Server 2005 e SQL Server 2008 è presente un aggiornamento rapido e DEVI essere eseguito in modalità di compatibilità 2000 affinché funzioni. Perché non fare semplicemente l'ordine quando si seleziona dalla vista?

Altri suggerimenti

Rimuoverei completamente la clausola ORDER BY dalla vista. Invece, specifica il tuo ordine nel momento in cui richiedi la visualizzazione.

Un commento in questo il post sul blog lo rende abbastanza chiaro.

Ancora una volta il testo di BOL:

  

" Quando ORDER BY viene utilizzato nella definizione di una vista, funzione incorporata, tabella derivata o sottoquery, la clausola viene utilizzata solo per determinare le righe restituite dalla clausola TOP. La clausola ORDER BY non garantisce i risultati ordinati quando vengono interrogati questi costrutti, a meno che ORDER BY non sia specificato anche nella query stessa. & Quot;

     

" Sebbene la definizione della vista contenga una clausola ORDER BY, quella clausola ORDER BY viene utilizzata solo per determinare le righe restituite dalla clausola TOP. Quando si esegue una query sulla vista stessa, SQL Server non garantisce che i risultati verranno ordinati, a meno che non sia specificato in modo esplicito, come mostrato nella seguente query:

SELECT * FROM TopView
ORDER BY LastName

"

Molto probabilmente i due server SQL sono versioni leggermente diverse. Esiste un hotfix noto per questo:

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

Devi sempre " ordinare " nell'ultimo punto possibile, poiché l'ordinamento è lento (N log N). Quando si esegue una selezione in una vista, in genere si include una clausola where. Vuoi solo ordinare quel set di risultati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top