2009-08-20 13 views
11

abbiamo una vista nel nostro database che ha un ordine BY in esso. Ora, mi rendo conto che le viste generalmente non ordinano, perché persone diverse possono usarlo per cose diverse e volere che sia ordinato in modo diverso. Questa vista tuttavia viene utilizzata per un caso d'uso MOLTO SPECIFICO che richiede un determinato ordine. (È la classifica di squadra per un campionato di calcio.)ORDER BY in una vista di SQL Server 2008

Il database è SQL Server 2008 Express, v.10.0.1763.0 su una casella di Windows Server 2003 R2.

La vista è definito come tale:

CREATE VIEW season.CurrentStandingsOrdered 
AS 
    SELECT TOP 100 PERCENT *, season.GetRanking(TEAMID) RANKING 
    FROM season.CurrentStandings 
    ORDER BY 
     GENDER, TEAMYEAR, CODE, POINTS DESC, 
     FORFEITS, GOALS_AGAINST, GOALS_FOR DESC, 
     DIFFERENTIAL, RANKING 

Restituisce:

GENDER, TEAMYEAR, CODE, TEAMID, CLUB, NAME, 
WINS, LOSSES, TIES, GOALS_FOR, GOALS_AGAINST, 
DIFFERENTIAL, POINTS, FORFEITS, RANKING 

Ora, quando si esegue un SELEZIONARE contro la vista, ordina i risultati per GENERE, TEAMYEAR , CODICE, TEAMID. Si noti che sta ordinando per TEAMID anziché PUNTI come specificato dalla clausola order by.

Tuttavia, se copio l'istruzione SQL ed eseguo esattamente come è in una nuova finestra di query, ordina correttamente come specificato dalla clausola ORDER BY.

risposta

19

L'ordine delle righe restituite da una vista con una clausola ORDER BY non è mai garantito. Se è necessario un ordine di riga specifico, è necessario specificare dove si seleziona dalla vista.

Vedere questa nota nella parte superiore della voce this Book On-Line.

+0

Questo è fastidioso! Posso vedere/capire non garantirlo in una VISTA, tipo ... ma dovrebbe almeno funzionare in una funzione valutata a livello di tabella. GRRR. Grazie comunque per la risposta. :) – eidylon

19

SQL Server 2005 ignora TOP 100 PERCENT di progettazione.

Prova invece TOP 2000000000.

Ora, cercherò di trovare un riferimento ... ero ad un seminario presentato da Itzak Ben-Gan che lo cita

trovato un po '...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

In questo caso particolare, l'ottimizzatore riconosce che TOP 100 PERCENT qualifica tutte le righe e non necessita di per essere calcolato.

+0

Sono curioso su questo aggiornamento rapido di SQL Server Ho appena imbattuto in: http://support.microsoft.com/kb/926292: se sto leggendo correttamente, quindi l'aggiornamento rapido 'corregge' il comportamento da ordinare? –

+0

@MitchWheat: sì, sembra familiare.Penso che significhi che l'interno TOP..ORDER BY fubars l'ORDER BY BY – gbn

+0

non sono sicuro che lo faccia. Sembra che l'applicazione dell'hotfix garantisca che ORDER BY in views funzioni sempre (il che ovviamente contraddice l'articolo di MSDN (e probabilmente il buon senso!)) –

2

esegue una traccia di profiler sul database e vedere la query che è in realtà in esecuzione quando si esegue una query la vista.

Si potrebbe anche prendere in considerazione l'utilizzo di una stored procedure per restituire i dati dalla vista, ordinati correttamente per il proprio caso d'uso specifico.

+0

Sì, stavo davvero cercando qualcosa direttamente interrogabile anche se ... vista, funzione valutata a livello di tabella, che non è uno sproc. – eidylon

4

Basta usare:

"Top (99) Percentuale"

o

"Top (un numero 1000s volte in più rispetto le righe di dati come 24.682.468,123 mila)" funziona! provalo

4

In SQL Server 2008, ORDER BY viene ignorato nelle viste che utilizzano TOP 100 PERCENT. Nelle versioni precedenti del server SQL, ORDER BY era consentito solo se si utilizzava TOP 100 PERCENT, ma un ordine perfetto non è mai stato garantito. Tuttavia, molti presumevano che fosse garantito un ordine perfetto. Suppongo che Microsoft non voglia indurre i programmatori e gli amministratori di database a credere che esista un ordine garantito utilizzando questa tecnica.

un'eccellente dimostrazione comparata di questa imprecisione, può essere trovato qui ...

http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by

Ops, ho appena notato che questo è stato già risposto. Ma controllare la dimostrazione comparativa vale comunque la pena dare un'occhiata.

2

ho trovato una soluzione alternativa.

Il mio piano iniziale era di creare una colonna "sort_order" che impedisse agli utenti di dover eseguire un ordinamento complesso.

Ho utilizzato una funzione con finestra ROW_NUMBER. Nella clausola ORDER BY, ho specificato l'ordinamento predefinito di cui avevo bisogno (proprio come sarebbe stato nell'ORDINE BY di un'istruzione SELECT).

ottengo diversi risultati positivi:

  1. Per impostazione predefinita, i dati vengono sempre restituiti in ordine predefinito Originariamente ho intenzione (questo è probabilmente dovuto alla funzione di finestra dover ordinare i dati prima di assegnare il valore sort_order)

  2. gli altri utenti possono ordinare i dati in modi alternativi, se decidono di

  3. la colonna sort_order è lì per un bisogno specifico ordinamento, rendendo più facile fo r utenti per ordinare i dati dovrebbero qualsiasi strumento che usano riorganizza il set di righe.

Nota: Nella mia applicazione specifica, gli utenti stanno accedendo alla visualizzazione tramite Excel 2010, e per impostazione predefinita i dati vengono presentati all'utente come avevo sperato, senza ulteriore ordinamento necessario.

Spero che questo aiuti chi ha un problema simile.

Cheers, Ryan

Problemi correlati