【问题标题】:how can I specify a "literal" table succinctly in a CTE?如何在 CTE 中简洁地指定“文字”表?
【发布时间】: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


【解决方案1】:
with foo as (select 1 as bar, 2 as baz 
             union all 
             select 3, 4) 
select * from foo;

【讨论】:

  • 这是Oracle的做法,我不会将其描述为“更简洁”:(
  • “Oracle”方式需要“select 1 as bar, 2 as baz from dual”。
  • 是的,Oracle 甚至 less 简洁:-P
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2022-10-06
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多