【问题标题】:Query on WITH Clause in SQL Server在 SQL Server 中查询 WITH 子句
【发布时间】:2015-08-31 11:38:04
【问题描述】:

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

with projects as (

select * from projectdetails

)
select * from projects

当我运行上述查询时,它运行良好。

但是当我再放一个选择查询时..它会抛出错误。

select * from 
(

with projects as (

select * from projectdetails


)

select * from projects

)

错误:关键字“with”附近的语法不正确。如果这个说法是 公用表表达式、xmlnamespaces 子句或更改 跟踪上下文子句,前一条语句必须终止 用分号。

同样的查询在 Oracle 中运行良好,但在 SQL Server 中却不行。

【问题讨论】:

  • 您的简化示例并没有任何意义。因为您包装的外部查询(如果要工作的话)似乎与select * from projects 做同样的事情。
  • 嗨..我知道上面的查询与从项目中选择 * 相同。但实际的问题是在其中编写一个带有 'with' 作为子查询的外部选择。当我写oracle 中的相同查询允许我编写但不能在上面提到的 mysql 中编写。
  • @Sravan:- 你不能有一个包含with 子句的子查询。但是,如果您可以提供有关您要实现的目标的更多详细信息,那么您可能可以找到其他方法来实现这一目标:)
  • 嗨 Rahul ..通过使用 with 子句,我得到了满足少数条件的所有项目的字段..该字段中的值将从 1 到 9。现在我需要计算值为 1 的字段,值从 2 到 5 的字段计数和值从 5 到 9 的字段计数。所以我使用三个联合子句...

标签: sql sql-server oracle common-table-expression


【解决方案1】:

SQL Server 和 Oracle 对公用表表达式的语法要求不同。

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

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

【讨论】:

    【解决方案2】:

    在 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

    【讨论】:

      【解决方案3】:

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

      with projects as (
      
      select * from projectdetails
      
      )
      select * from projects
      

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

      【讨论】:

        【解决方案4】:

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

        with projectdetails as (
        
        select * from projectdetails
        
        
        ),projects AS
        
        select * from projects
        
        )
        SELECT * FROM projects  --<-- here you select from Projects or projectdetails
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-29
          • 2021-12-14
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          • 2015-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多