是否可以针对公用表表达式执行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,则它们需要位于语句的开头(逗号分隔,并且只有一个;WITH
用于开始 CTE 列表):
;WITH CTE AS (......),
[UserDefined] AS (.......)
SELECT.....
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的SELECT
语句中同时使用这两个(甚至两个以上)。
需要先声明多个 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)