【发布时间】:2023-03-21 21:45:01
【问题描述】:
在 MS SQL Server 2008 及更高版本中,可以使用 values 作为子查询来指定“文字”表:
select * from (
values (1,2),
(3,4)
) as foo(bar,baz)
但是,我还没有找到一种合理的方法来在 with 子句 (CTE) 中指定这一点。
我希望下面的方法能工作,因为它在对程序员友好的 PostgreSQL 中工作得很好……但它给出了 SQL Server 的语法错误:
with foo(bar,baz) as (
values (1,2),
(3,4)
)
select * from foo;
这种替代形式确实有效,但似乎过于冗余且容易出错:
with foo as (
select * from (
values (1,2),
(3,4)
) as foo(bar, baz)
)
select * from foo;
有没有更简洁的方法在 SQL Server 中的 CTE 中指定文字表?
【问题讨论】:
-
不,在 CTE 中没有好的方法。那个不必要的 SELECT 让我很恼火!
-
这几乎就是所有 RDBMS 的标准。似乎人们总是希望 SQL 更简洁,但它是一种非常冗长的语言,通常更明确会产生更好的结果。
-
确实如此。我想我被 PostgreSQL 宠坏了,它实际上试图让这样明显的事情变得容易。 :-/
-
@JNevill:Postgres 的示例是标准 SQL,所以这个请求不是关于“想要”更多,而是关于遵循标准
标签: sql-server common-table-expression literals