2017-03-18 131 views
2

我只是對我以前從未在sql server中遇到過的東西感到好奇。來自一列中的查詢值的結果

這個查詢:

SELECT N FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) T(N) 

給我的結果是:

+---+ 
| N | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

什麼規則嗎?顯然這是將所有值對齊到一列中。 sql server的語法是用T(N)來定義它的嗎?

在另一邊,這個查詢給出了單獨的列結果:

select 0,1,2,3,4,5,6,7,8,9 

我只是不明白,爲什麼第一個查詢結果一致都變成一列?

+0

看起來很熟悉^。^ – SqlZim

+0

確實:)我從這裏學習你的CTE魔法http://stackoverflow.com/a/42797191/867703 – FrenkyB

回答

1

詹姆斯Z是正確的金錢,但於它在你參考答案擴大:

在從拉代碼,該節被用來啓動數字表的stacked cte。數字本身並不重要,但我喜歡那樣。它們都可以是1或0,它不會改變它在這種情況下的使用方式。

基本上我們有10行,然後我們要交叉連接它自己N次數來增加行數,直到我們需要的數量或者更多。在cross join我別名n與所得的行數deka是10,hecto是100,kilo是1000,等等。

下面是函數外的類似查詢你被引用:

declare @fromdate date = '20000101'; 
declare @years int = 30; 
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, dates as (
    select top (datediff(day, @fromdate,dateadd(year,@years,@fromdate))) 
     [Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate)) 
    from n as deka cross join n as hecto cross join n as kilo 
       cross join n as tenK cross join n as hundredK 
    order by [Date] 
) 
select [Date] 
from dates; 

stacked cte是產生或模擬數字或日期表非常有效,但使用實際numberscalendar表將執行隨着規模的增加而變好。

檢查這些了相關的基準:

在HIST文章,阿龍貝特朗創建一種利用堆疊cte

;WITH e1(n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), 
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), 
.... 
3

values子句與您在插入語句中可以使用的類似,它被稱爲Table Value Constructor。你的例子只有一列和幾行,但你也可以有多列以逗號分隔。 T(N)定義了表(T)的別名和列(N)的名稱。

相關問題