【问题标题】:Cannot use WITH statement two times不能两次使用 WITH 语句
【发布时间】:2017-09-29 18:29:47
【问题描述】:

我不想创建这样构造的视图: (简体)

Create VIEW viewAll AS
With TempLevel1 AS

( SELECT statement )

With TempLevel2 AS (SELECT * from TempLevel1)

SELECT * from TempLevel2

问题是我不能使用这样的 With 语句,因为 以下错误:

关键字“With”附近的语法不正确。 关键字“with”附近的语法不正确。

如果这个语句是 公共表表达式、xmlnamespaces 子句或更改跟踪 上下文子句,前一条语句必须以 分号。

我必须指定 SELECT 查询要复杂得多,而且我必须使用 With 两次。

将第一个 with 语句创建为另一个视图,如 viewTempLevel1(并在 With TempLevel2 语句中使用)会更好吗?

【问题讨论】:

  • 有很多语句不能重复使用,例如SELECTFROMWHERE。在这种情况下,它们有时只接受几个参数。
  • @ÁlvaroGonzález 但这里并非如此。 关键字不需要重复指定多个CTE
  • @PanagiotisKanavos 不是吗?我会说它不能。您甚至将其发布为答案,所以我想我被误解了。

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


【解决方案1】:

您无需重复 WITH 关键字。用逗号分隔 CTE 表达式:

With CTE_Level1 AS
( 
    SELECT statement 
),
CTE_Level2 AS 
(
    SELECT * from CTE_Level1
)
SELECT * from CTE_Level2

【讨论】:

    【解决方案2】:

    documentation for Common table Expressions (CTE),您可以

    使用逗号分隔多个 CTE 定义

    示例是(直接从文档中取出)

    WITH Sales_CTE (SalesPersonID, TotalSales, SalesYear)  
    AS  
    -- Define the first CTE query.  
    (  
        SELECT SalesPersonID, SUM(TotalDue) AS TotalSales, YEAR(OrderDate) AS SalesYear  
        FROM Sales.SalesOrderHeader  
        WHERE SalesPersonID IS NOT NULL  
           GROUP BY SalesPersonID, YEAR(OrderDate)  
    
    )  
    ,   -- Use a comma to separate multiple CTE definitions.  
    
    -- Define the second CTE query, which returns sales quota data by year for each sales person.  
    Sales_Quota_CTE (BusinessEntityID, SalesQuota, SalesQuotaYear)  
    AS  
    (  
           SELECT BusinessEntityID, SUM(SalesQuota)AS SalesQuota, YEAR(QuotaDate) AS SalesQuotaYear  
           FROM Sales.SalesPersonQuotaHistory  
           GROUP BY BusinessEntityID, YEAR(QuotaDate)  
    )  
    
    -- Define the outer query by referencing columns from both CTEs.  
    SELECT SalesPersonID... 
    

    在你的情况下,语法是......

    With TempLevel1 AS
        ( SELECT statement [...]), 
    TempLevel2 AS 
        (SELECT * from TempLevel1)
    
    SELECT * from TempLevel2
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2019-02-14
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2022-12-23
      相关资源
      最近更新 更多