Sql server 一列中查询值的结果
我只是对我以前在SQLServer中从未遇到过的东西很好奇 此查询: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 另一方面,此查询
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),
....