2012-04-08 203 views
38

以下SQL來自Itzik Ben-Gan,用於生成數字表。 order by (select null)部分是什麼意思?謝謝。「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; 

謝謝!

回答

62

ROW_NUMBER要求語法上有ORDER BY條款。沒有一個你不能使用它。 SELECT NULL是一種黑客,可以在不執行任何特定順序的情況下關閉錯誤。在這種情況下,我們不需要強制執行任何訂單,所以最快的選擇是使用SELECT NULL

優化器可以看穿這個技巧,因此它沒有運行時成本(通過查看執行計劃可以輕鬆驗證此聲明)。

+12

它也可以用作意圖聲明,當它不是實際需要時。例如,在Micrsoft的培訓工具包書籍「查詢Microsoft SQL Server 2012」中,他們建議將其添加到有效查詢中,「......如果您真的在三個任意行之後,則添加一個ORDER BY條款 用表達式(SELECT NULL)讓人們知道您的選擇是有意的,而不是 的疏忽。「 – 2015-09-28 13:00:20