代码之家  ›  专栏  ›  技术社区  ›  Paul Mendoza

我可以像我的例子一样在TSQL中使用WITH两次来过滤结果集吗?

  •  16
  • Paul Mendoza  · 技术社区  · 17 年前

    我需要做这样的事情,但SQL Server 2008不喜欢它。我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最佳方式,但我的重点是WITH语句的功能,而不是select和where语句。

    带填充物1 AS( 从startdate>的员工中选择姓名、开始日期和id; 0 )

    带填充物2 AS( 从stuff1中选择名称、开始日期和id)

    从id>的填充2中选择*;10

    3 回复  |  直到 17 年前
        1
  •  33
  •   Cade Roux    17 年前

    我经常这样做:

    WITH stuff1 AS (
        SELECT name
               ,startdate
               ,id
        FROM employees
        WHERE startdate > 0
    )
    ,stuff2 AS (
        SELECT name
               ,startdate
               ,id
        FROM stuff1
    )
    SELECT *
    FROM stuff2
    WHERE id > 10
    

    据我所知,我的CTE还没有达到极限。

    你唯一不能做的事情(这将非常有用)是在单独的环境中重用CTE SELECT s

    WITH stuff1 AS (
        SELECT name
               ,startdate
               ,id
        FROM employees
        WHERE startdate > 0
    )
    ,stuff2 AS (
        SELECT name
               ,startdate
               ,id
        FROM stuff1
    )
    SELECT *
    FROM stuff2
    WHERE id > 10
    ;
    SELECT *
    FROM stuff2
    WHERE id < 10
    

    说吧。相反,您必须再次复制和粘贴整个CTE链。

        2
  •  0
  •   BuddyJoe    17 年前

    您可以向我们提出一系列子查询。 或者嵌套在CTE中的子查询。

    使用Northwind的子查询示例:

    SELECT * FROM 
        (SELECT * FROM
            (SELECT * FROM dbo.Employees WHERE Country = 'USA') as TableFiltered1
         ) AS TableFilterd2 WHERE City = 'Seattle'
    

    您可以使用两个CTE,但可能不是您想要的方式,请参阅:
    https://web.archive.org/web/20210927200924/http://www.4guysfromrolla.com/webtech/071906-1.shtml

        3
  •  -3
  •   Kieran Senior    17 年前

    不,正如我前几天发现的那样,一份声明中只能有一个CTE。

    编辑 :WITH语句是一个通用表表达式,非常方便。