我只是对以前在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 :(得分:3)
values子句与insert语句中使用的类似,它被称为Table Value Constructor。您的示例只有一列和多行,但您也可以使用逗号分隔多个列。 T(N)定义表(T)的别名和列(N)的名称。
答案 1 :(得分:1)
James Z对这笔钱是正确的,但要扩展你所引用的答案:
在从中提取的代码中,该部分用于启动stacked cte
的数字表。数字本身并不重要,但我喜欢它们。它们都可以是1或0,它不会改变它在这种情况下的使用方式。
基本上我们有10行,然后我们要将它连接到自N
次,以增加行数,直到我们需要的数量或更多。在cross join
我的别名n
中,结果行数deka
为10,hecto
为100,kilo
为1,000,等等。
以下是您引用的函数之外的类似查询:
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
对于生成或模拟数字或日期表非常有效,但使用实际的numbers
或calendar
表会随着比例增加而表现更好。
检查这些相关基准:
在hist文章中,Aaron Bertrand使用
创建堆叠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),
....