针对公用表表达式(CTE)的T-SQL JOIN

Jar*_*red 18 sql t-sql

是否可以针对公用表表达式执行JOIN子查询?如果没有,那么有人可以让我知道如何执行我在下面尝试做的事情吗?例子很棒.

例如:

LEFT JOIN (

            ;WITH [UserDefined]
                AS (SELECT *, -- Make sure we get only the latest revision.
                        ROW_NUMBER() OVER (PARTITION BY [ID]
                                                ORDER BY [RevisionNumber] DESC) AS RN
                    FROM [syn_Change])

            SELECT [UserDefined].[ID]
                ,[UserDefined].[ChangeNumber]
                ,[UserDefined].[Usr_CoResponsibility]
                ,[UserDefined].[Usr_StarFlowStatus]

            FROM [UserDefined]
            WHERE (RN = 1) 

            ) [UserColumns]
ON [UserColumns].[ChangeNumber] = [CTE].[ChangeNumber]
Run Code Online (Sandbox Code Playgroud)

这是我的完整查询:

;WITH CTE
    AS (SELECT *, -- Make sure we get only the latest revision.
            ROW_NUMBER() OVER (PARTITION BY [ItemID]
                                    ORDER BY [RevisionNumber] DESC) AS RN
        FROM [dw_Change])

SELECT [CTE].[ItemID]
        ,[CTE].[ViewID]
        ,[CTE].[FolderItemID]
        ,[CTE].[RevisionNumber]
        ,[CTE].[ChangeNumber]
        ,[CTE].[Synopsis]
        ,[CTE].[Description]
        ,[CTE].[EnteredOn]
        ,[CTE].[Responsibility]
        --,[UserColumns].[Usr_CoResponsibility]
        --,[UserColumns].[Usr_StarFlowStatus]
        ,[CTE].[Status] -- This will display the human name on the front-end with code.
        ,[Users].[F7] AS [ResponsibilityName]
        ,[GroupName].[Name] AS [AppGroupName]
        ,[AppName].[Name] AS [AppName]
FROM CTE
LEFT JOIN [S3] [Users] ON [Users].[F0] = [CTE].[Responsibility]
LEFT JOIN (SELECT [Name], [ViewID]
            FROM [dw_Folder]
            WHERE ([FolderItemID] = -1)) [GroupName]
ON [GroupName].[ViewID] = [CTE].[ViewID]

LEFT JOIN (SELECT [Name], [ItemID]
            FROM [dw_Folder]
            WHERE ([FolderItemID] <> -1)) [AppName]
ON [AppName].[ItemID] = [CTE].[FolderItemID]

LEFT JOIN (

            ;WITH [UserDefined]
                AS (SELECT *, -- Make sure we get only the latest revision.
                        ROW_NUMBER() OVER (PARTITION BY [ID]
                                                ORDER BY [RevisionNumber] DESC) AS RN
                    FROM [syn_Change])

            SELECT [UserDefined].[ID]
                ,[UserDefined].[ChangeNumber]
                ,[UserDefined].[Usr_CoResponsibility]
                ,[UserDefined].[Usr_StarFlowStatus]

            FROM [UserDefined]
            WHERE (RN = 1) 

            ) [UserColumns]
ON [UserColumns].[ChangeNumber] = [CTE].[ChangeNumber]

WHERE (RN = 1)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Yuc*_*uck 42

在定义CTE之前,您要在查询的其余任何内容之前执行此操作.所以你不能写:

LEFT JOIN (
  ;WITH CTE
  ...
)
Run Code Online (Sandbox Code Playgroud)

暂时不说,人们放在前面的原因是因为之前的所有陈述都需要终止.如果开发人员习惯于终止所有SQL语句,那么就没有必要,但我离题了......;WITH;

您可以编写多个CTE,如下所示:

WITH SomeCTE AS (
  SELECT ...
  FROM ...
), AnotherCTE AS (
  SELECT ...
  FROM ...
)
SELECT *
FROM SomeCTE LEFT JOIN
     AnotherCTE ON ...
;
Run Code Online (Sandbox Code Playgroud)

  • 只要在其他CTE之前定义了一个CTE,就可以在随后的CTE中引用它. (6认同)

mar*_*c_s 5

如果您有多个 CTE,则它们需要位于语句的开头(逗号分隔,并且只有一个;WITH用于开始 CTE 列表):

;WITH CTE AS (......),
 [UserDefined] AS (.......)
SELECT.....
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的SELECT语句中同时使用这两个(甚至两个以上)。


Jam*_*ill 5

需要先声明多个 CTE。例子:

WITH CTE_1 AS
(
    ....
),
CTE_2 AS
(
    ...
)

SELECT        *
FROM          FOO f
LEFT JOIN     CTE_1 c1 ON c1.[SomeCol] = f.[SomeCol]
LEFT JOIN     CTE_2 c2 ON c2.[SomeCol] = f.[SomeCol]
Run Code Online (Sandbox Code Playgroud)

  • 你加入什么? (2认同)