我可以使用多个"with"吗?

cnd*_*cnd 167 sql t-sql sql-server-2008

仅举例来说

With DependencedIncidents AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)

With lalala AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)
Run Code Online (Sandbox Code Playgroud)

不起作用."附近的错误".

另外我想首先使用内部第二个.它是真的还是我需要使用临时表?

Tom*_*icz 297

尝试:

With DependencedIncidents AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
),
lalala AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)
Run Code Online (Sandbox Code Playgroud)

是的,您可以在公用表表达式定义中引用公用表表达式.甚至是递归的.这导致一些非常巧妙的技巧.

  • 对于那些没有像我一样立即注意到它的人,这里的问题是在原始声明之后添加一个逗号.大声笑 (19认同)
  • 而不是再写"with"这个词 (6认同)
  • @LongLe 不,它们不等同于连接,也不是表。这些是 CTE - 通用表表达式。它们更像是……命名查询,您可以像使用表一样使用它们……或者更像是视图。请谷歌他们。他们很整洁。它是最好的标准 SQL 功能之一,极大地帮助保持复杂查询的可理解性和可控性。 (2认同)

mar*_*c_s 102

是的 - 就这样做:

WITH DependencedIncidents AS
(
  ....
),  
lalala AS
(
  ....
)
Run Code Online (Sandbox Code Playgroud)

您无需重复WITH关键字

  • lalala可以使用DependencedIncidents吗? (8认同)
  • @HenryYang:不 - 较晚的 CTE(`lalala`)可以使用在它之前定义的任何 CTE - 但较早的 CTE 不能使用稍后定义的 CTE.... (6认同)