一列中查询值的结果

时间:2017-03-18 13:26:28

标签: sql-server tsql sql-server-2012

我只是对以前在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

我只是不明白为什么第一个查询的结果全部对齐到一列?

2 个答案:

答案 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对于生成或模拟数字或日期表非常有效,但使用实际的numberscalendar表会随着比例增加而表现更好。

检查这些相关基准:

在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),
....