2017-11-13 10 views
4

を繰り返さないようにします。 enter image description hereは左外側継手を介したクエリに追加されたデータは、私は3つの階層データのレベルとオプションの4つ目のデータ・レベルを持つデータベース構造(以下ERダイアグラムを)持って

Iは、三つのレベルのデ正規化されたデータを取得するクエリを作成する場合 - として、以下に示す3つのテーブルを横切ってサンプルデータとレベル3にレベル1:照会する

enter image description here

このデータのレイアウトは、以下のように非常に単純であり、期待通りです。

enter image description here

以下のクエリを実行すると

、私は、次の出力を取得する(そして、私はL4とL1のセットをクラブにし、別のクエリのような1つL4を移動した後、設定されたL1を接合することによって様々な組み合わせを試してみました - L4等) - これもまた予想通りです。

SELECT  [Group].GroupId, [Group].GroupName, Category.CategoryId, Category.CategoryName, RLI.RLIId, RLI.RLIText, Comment.CommentId, Comment.CommentText, ManagementResponse.ManagementResponseId, 
         ManagementResponse.ManagementResponseTest 
FROM   Category INNER JOIN 
         [Group] ON Category.GroupId = [Group].GroupId INNER JOIN 
         RLI ON Category.CategoryId = RLI.CategoryId LEFT OUTER JOIN 
         ManagementResponse ON RLI.RLIId = ManagementResponse.RLIId LEFT OUTER JOIN 
         Comment ON RLI.RLIId = Comment.RLIId 

enter image description here

しかし、私は次の形式でデータを必要とする - これは私が(私はレベル4のデータは、私として繰り返したくはありません取得する方法を見つけ出すことができませんものです)に参加する左外側を経由して、追加のレベル4のデータを追加します。 enter image description here

+0

をuが、内側しようとしなかった代わりに、左の参加加入? –

+0

レベル4のデータはオプションであるため、内部結合がどのように解決されるかは不明です。内部結合により、上位レベルのデータが失われます。 –

+0

'CommentId'と' ManagementResponseId'が意図的に出力されているか、偶発的に出力されていますか? – Caleth

答えて

1

のようなものは、このクエリを使用すると、最終的な出力与える: enter image description here

WITH CommentAndResponse AS (

SELECT Comment.CommentId, 
     Comment.CommentText, 
     ManagementResponse.ManagementResponseId, 
     ManagementResponse.ManagementResponseTest, 
    COALESCE(Comment.RLIId, ManagementResponse.RLIId) AS RLIId 
FROM (
    (SELECT Comment.CommentId, 
      Comment.CommentText, 
      Comment.RLIId, 
      ROW_NUMBER() OVER (PARTITION BY Comment.RLIId ORDER BY Comment.CommentId) AS CommentRowNumber 
    FROM Comment) AS Comment 
    FULL JOIN 
    (SELECT ManagementResponse.ManagementResponseId, 
      ManagementResponse.ManagementResponseTest, 
      ManagementResponse.RLIId, 
      ROW_NUMBER() OVER (PARTITION BY ManagementResponse.RLIId ORDER BY ManagementResponse.ManagementResponseId) AS ManagementResponseRowNumber 
    FROM ManagementResponse) AS ManagementResponse 
    ON Comment.CommentRowNumber = ManagementResponse.ManagementResponseRowNumber AND Comment.RLIId = ManagementResponse.RLIId) 
    ) 

SELECT   [Group].GroupId, [Group].GroupName, Category.CategoryId, Category.CategoryName, RLI.RLIId, RLI.RLIText, CommentAndResponse.CommentId, CommentAndResponse.CommentText, CommentAndResponse.ManagementResponseId, CommentAndResponse.ManagementResponseTest 
FROM   [Category] 
INNER JOIN  [Group] ON Category.GroupId = [Group].GroupId 
INNER JOIN  [RLI] ON Category.CategoryId = RLI.CategoryId 
LEFT OUTER JOIN [CommentAndResponse] ON RLI.RLIId = CommentAndResponse.RLIId 
+0

は完璧でした。いいです! –

1

あなたはComment.CommentIdManagementResponse.ManagementResponseIdに等しいかのどちらかがNULLであることを指定する必要があります。それはJOINまたは別WHERE

SELECT   [Group].GroupId, [Group].GroupName, Category.CategoryId, Category.CategoryName, RLI.RLIId, RLI.RLIText, Comment.CommentId, Comment.CommentText, ManagementResponse.ManagementResponseId, 
         ManagementResponse.ManagementResponseTest 
FROM   [Category] 
INNER JOIN  [Group] ON Category.GroupId = [Group].GroupId 
INNER JOIN  [RLI] ON Category.CategoryId = RLI.CategoryId 
LEFT OUTER JOIN [ManagementResponse] ON RLI.RLIId = ManagementResponse.RLIId 
LEFT OUTER JOIN [Comment] ON RLI.RLIId = Comment.RLIId 
WHERE   ManagementResponse.ManagementResponseId = Comment.CommentId OR ManagementResponse.ManagementResponseId IS NULL OR Comment.CommentId IS NULL 

の一部にすることができますこれは、これらのIDを使用して、モデル化する関係である等しい始めることを前提としています。サンプルデータにはこれが表示されているようですが、例をどのように組み立てたかは偶然かもしれません。 RLIId以外CommentManagementResponseの間に関係がない場合は別の方法として、

WITH CommentAndResponse AS (
    SELECT Comment.CommentId, Comment.CommentText, ManagementResponse.ManagementResponseId, ManagementResponse.ManagementResponseTest, 
     COALESCE(Comment.RLIId, ManagementResponse.RLIId) AS RLIId, 
     ROW_NUMBER() OVER (ORDER BY Comment.CommentId, ManagementResponse.ManagementResponseId, PARTITION BY Comment.RLIId, ManagementResponse.RLIId) AS rn 
    FROM Comment 
    FULL JOIN ManagementResponse ON Comment.RLIId = ManagementResponse.RLIId) 
SELECT   [Group].GroupId, [Group].GroupName, Category.CategoryId, Category.CategoryName, RLI.RLIId, RLI.RLIText, CommentAndResponse.CommentId, CommentAndResponse.CommentText, CommentAndResponse.ManagementResponseId, CommentAndResponse.ManagementResponseTest 
FROM   [Category] 
INNER JOIN  [Group] ON Category.GroupId = [Group].GroupId 
INNER JOIN  [RLI] ON Category.CategoryId = RLI.CategoryId 
LEFT OUTER JOIN [CommentAndResponse] ON RLI.RLIId = CommentAndResponse.RLIId AND CommentAndResponse.rn = 1 
+0

答えに感謝します。私のチームメンバーの1人が、あなたのソリューション(構文上の問題があります)に基づいて作業しています。回答としてマークされた作業ソリューションを参照してください。あなたの意見は、私たちがそこに到達するのを助けました –

関連する問題