查询 SQL 服务器中的 WITH 子句

Query on WITH Clause in SQL Server

我有一个示例查询(完全修改)如下:

with projects as (

select * from projectdetails

)
select * from projects

当我运行上面的查询时,运行宁没问题。

但是当我再输入一个 select 查询时..它抛出错误。

select * from 
(

with projects as (

select * from projectdetails


)

select * from projects

)

Error: Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

相同的查询 运行 在 Oracle 中很好,但在 SQL 服务器中却不行。

SQL Server 和 Oracle 对常见的 table 表达式有不同的语法要求。

在 Oracle 中,这些可以出现在任何 SELECT 之前。在 SQL 服务器中,它们需要出现在查询的开头。因此,您不能在其中包含 WITH 的子查询。

通常,您只需将 WITH 语句移到第一个 SELECT 之前,查询将在两个数据库中都有效。

您尝试执行的查询称为 Common Table Expression,您使用的语法不是正确的使用方式,即您不能在 WITH 子句中使用select 声明。

with projects as (

select * from projectdetails

)
select * from projects

上面的查询很好并且可以工作,但是您发布的下一个查询既不正确也没有意义,因为它看起来好像您正在尝试做与上面相同的事情。

由于其他两个答案谈到了 CTE 的语法及其局限性,因此您可以通过以下方式执行此操作,即多个 CTE。

with projectdetails as (

select * from projectdetails


),projects AS

select * from projects

)
SELECT * FROM projects  --<-- here you select from Projects or projectdetails

在 Oracle 上运行什么并不重要,请参阅支持的 SQL Server SELECT syntax

简化版:

[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]

SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ] 

已满:

<SELECT statement> ::=  
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]
    <query_expression> 
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } 
  [ ,...n ] ] 
    [ <FOR Clause>] 
    [ OPTION ( <query_hint> [ ,...n ] ) ] 
<query_expression> ::= 
    { <query_specification> | ( <query_expression> ) } 
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [...n ] ] 
<query_specification> ::= 
SELECT [ ALL | DISTINCT ] 
    [TOP ( expression ) [PERCENT] [ WITH TIES ] ] 
    < select_list > 
    [ INTO new_table ] 
    [ FROM { <table_source> } [ ,...n ] ] 
    [ WHERE <search_condition> ] 
    [ <GROUP BY> ] 
    [ HAVING < search_condition > ] 

如果您不知道如何直接阅读此语法,您可以为以下 BOL 示例中的每个语法定义生成 Railroad Diagrams