2011-12-06 4 views
11

共通テーブル式に対してJOINサブクエリを実行できますか?そうでない場合は、誰かが私が下にしようとしていることを実行する方法を教えてもらえますか?例は素晴らしいでしょう。例えば共通テーブル式(CTE)に対する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] 

ここに私の完全なクエリは次のとおりです。

;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) 

本当にありがとうございました!

答えて

30

CTEを定義すると、残りのクエリの前に実行されます。だから、書くことはできません。余談迅速として

LEFT JOIN (
    ;WITH CTE 
    ... 
) 

人々はWITHの前で;を入れた理由以前のすべてのステートメントを終了する必要があるためです。開発者は;ですべてのSQLステートメントを終了するのが習慣に取得することができれば、それは必要ではないだろうが、私は脱線...

あなたはそうのような複数のCTEを書き込むことができます。

WITH SomeCTE AS (
    SELECT ... 
    FROM ... 
), AnotherCTE AS (
    SELECT ... 
    FROM ... 
) 
SELECT * 
FROM SomeCTE LEFT JOIN 
    AnotherCTE ON ... 
; 
+6

そして、 1つのCTEが他のものの前に定義されている限り、それはそれに続くCTE内で参照することができます。 – Bora

1

複数のCTEを持つことができます。あなたはそれらを両方の上に置く必要があります。

hereを参照してください:

あなたは、しかし、コンマでそれぞれのCTEを分離することにより、WITHキーワードの後に​​、複数のCTEを定義することができます。その後、

;WITH CTE AS (......), 
[UserDefined] AS (.......) 
SELECT..... 

と次のことができます。

2

あなたが複数のCTEのを持っている場合、彼らは(カンマ区切り、一つだけ;WITHは、CTEのリストを開始するために)あなたの文の先頭にする必要がありますSELECTステートメントで両方の(または2つ以上の)使用してください。

3

最初に複数のCTEを宣言する必要があります。例:

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

SELECT  * 
FROM   FOO 
LEFT JOIN  CTE_1 
LEFT JOIN  CTE_2 
1
; 
WITH 
    RANKED_CTE AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY [ItemID] ORDER BY [RevisionNumber] DESC) AS RN 
    FROM 
    [dw_Change] 
) 
, 
    CTE AS 
(
    SELECT 
    * 
    FROM 
    RANKED_CTE 
    WHERE 
    RN = 1 
) 
, 
    GroupName AS 
(
    SELECT 
    [Name], [ViewID] 
    FROM 
    [dw_Folder] 
    WHERE 
    ([FolderItemID] = -1) 
) 
, 
    AppName AS 
(
    SELECT 
    [Name], [ItemID] 
    FROM 
    [dw_Folder] 
    WHERE 
    ([FolderItemID] <> -1) 
) 
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 [GroupName] ON [GroupName].[ViewID] = [CTE].[ViewID] 
LEFT JOIN [AppName]  ON [AppName].[ItemID] = [CTE].[FolderItemID] 
関連する問題