2012-04-08 4 views
38

Das folgende SQL stammt von Itzik Ben-Gan, das zum Generieren einer Zahlentabelle verwendet wird. Was bedeutet der order by (select null) Teil? Vielen Dank.Was bedeutet "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; 

Vielen Dank!

Antwort

62

ROW_NUMBER erfordert eine ORDER BY Klausel syntaktisch. Sie können es nicht ohne eins verwenden. SELECT NULL ist ein Hack, um den Fehler zu stoppen, während keine bestimmte Reihenfolge durchgesetzt wird. In diesem Fall müssen wir keine Bestellung erzwingen, daher ist die schnellste Option die Verwendung von SELECT NULL.

Der Optimierer durchschaut diesen Trick, so dass er keine Laufzeitkosten hat (dieser Anspruch wird leicht durch einen Blick auf den Ausführungsplan bestätigt).

+12

Es kann auch als eine Absichtserklärung verwendet werden, wenn es nicht wirklich benötigt wird. Zum Beispiel raten sie in Micrsoft's Trainingskit-Buch "Microsoft SQL Server 2012 abfragen", sie zu einer gültigen Abfrage hinzuzufügen, wie "... wenn Sie wirklich nach drei beliebigen Zeilen suchen, ist es vielleicht eine gute Idee, eine ORDER hinzuzufügen BY-Klausel mit dem Ausdruck (SELECT NULL), um Menschen wissen zu lassen, dass Ihre Wahl beabsichtigt ist und nicht ein Versehen. " –