Sql server 一列中查询值的结果

Sql server 一列中查询值的结果,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我只是对我以前在SQLServer中从未遇到过的东西很好奇 此查询: 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的语法是否定义了TN 另一方面,此查询

我只是对我以前在SQLServer中从未遇到过的东西很好奇

此查询:

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的语法是否定义了TN

另一方面,此查询通过单独的列提供结果:

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

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

values子句与您可以在insert语句中使用的类似,它被称为。您的示例只有一列和几行,但也可以有多个以逗号分隔的列。TN为您定义表T的别名和列N的名称。

James Z在money上是正确的,但要在您引用的答案中详细说明它的作用:

在从中提取的代码中,该部分用于启动堆叠cte的数字表。数字本身并不重要,但我喜欢这样。它们可能都是1,也可能都是0,这不会改变它在这个实例中的使用方式

基本上我们有10行,然后我们将把它交叉连接到self N多次,以增加行数,直到达到我们需要的数量或更多。在交叉连接I别名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;
堆叠的cte对于生成或模拟数字或日期表非常有效,尽管随着比例的增加,使用实际数字或日历表的性能会更好

查看以下相关基准:

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