2012-04-08 12 views
38

Il seguente SQL è tratto da Itzik Ben-Gan utilizzato per generare una tabella di numeri. Cosa significa la parte order by (select null)? Grazie.Che cosa significa "ORDER BY (SELEZIONA NULL)"?

DECLARE @number_of_numbers INT; 
SELECT @number_of_numbers = 100000; 

WITH a AS (SELECT 1 AS i 
       UNION ALL 
       SELECT 1 
      ), 
     b AS (SELECT 1 AS i 
       FROM  a AS x , 
         a AS y 
      ), 
     c AS (SELECT 1 AS i 
       FROM  b AS x , 
         b AS y 
      ), 
     d AS (SELECT 1 AS i 
       FROM  c AS x , 
         c AS y 
      ), 
     e AS (SELECT 1 AS i 
       FROM  d AS x , 
         d AS y 
      ), 
     f AS (SELECT 1 AS i 
       FROM  e AS x , 
         e AS y 
      ), 
     numbers 
      AS (SELECT TOP (@number_of_numbers) 
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL 
                )) AS number 
       FROM  f 
      ) 
    SELECT * 
    FROM numbers; 

Grazie!

risposta

62

ROW_NUMBER richiede una clausola ORDER BY sintatticamente. Non puoi usarlo senza uno. SELECT NULL è un trucco per arrestare l'errore senza imporre alcun ordine particolare. In questo caso non è necessario imporre alcun ordine, quindi l'opzione più veloce è utilizzare SELECT NULL.

L'ottimizzatore vede attraverso questo trucco, quindi non ha costi di runtime (questa richiesta è facilmente verificabile guardando il piano di esecuzione).

+12

Può anche essere usato come una dichiarazione di intenti quando non è effettivamente richiesto. Ad esempio, nel libro di formazione Micrsoft "Querying Microsoft SQL Server 2012", consigliano di aggiungerlo a una query valida come "... se sei davvero dopo tre righe arbitrarie, potrebbe essere una buona idea aggiungere un ORDINE Clausola BY con l'espressione (SELEZIONA NULL) per far sapere alle persone che la scelta è intenzionale e non a una svista. " –