查询 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
:
我有一个示例查询(完全修改)如下:
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
: