2012-04-08 12 views
38

Poniższy kod SQL pochodzi z Itzika Ben-Gana, który służy do generowania tabeli liczb. Co oznacza część order by (select null)? Dzięki.Co oznacza "ORDER BY (SELECT 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; 

Dzięki!

Odpowiedz

62

ROW_NUMBER wymaga składni klauzuli. Nie możesz go użyć bez niego. SELECT NULL to hack, aby zamknąć błąd, nie wymuszając żadnej określonej kolejności. W takim przypadku nie musimy egzekwować żadnego zamówienia, dlatego najszybszym rozwiązaniem jest użycie SELECT NULL.

Optymalizator widzi tę sztuczkę, więc nie ma kosztów runtime (roszczenie to można łatwo zweryfikować, patrząc na plan wykonania).

+12

Może być również używany jako oświadczenie woli, gdy nie jest faktycznie wymagany. Na przykład w zestawie szkoleniowym Micrsoft "Querying Microsoft SQL Server 2012" zaleca się dodanie go do prawidłowego zapytania jako "... jeśli jesteś naprawdę po trzech dowolnych rzędach, dobrym pomysłem może być dodanie ZAMÓWIENIA Klauzula BY z wyrażeniem (WYBIERZ NULL), aby ludzie wiedzieli, że wybór jest celowy, a nie niedopatrzenie. " –