0

私はA、B、C、Dからなる階層構造を持っています。各エンティティは、その子に対して 1 対多の関係を持っています (A -> 1:N -> B -> 1:N -> C -> 1:N -> D)。別のエンティティがあります。それを X と呼びましょう。フィールドを使用し
てこれらの階層エンティティの 1 つにリンクできます (は A、B、C または D への外部キーであり、名前を含むルックアップ テーブルへの外部キーです) A、B、C および D の)LevelIDLevelTypeIDLevelIDLevelTypeID

提供されたLevelIDLevelTypeIDに基づいて、現在の階層エンティティと上位の親レベルのエンティティを取得できるクエリが必要です。

以下は、4 つのテーブルのサンプル データです。

   A
         ID       
         --
         1       
   B
         ID       A_ID
         ----     -----     
         10       1
   C
         ID       B_ID
         ----     -----
         100      10
   D
         ID       C_ID
         -----    -----
         1000     100
         1001     100

LevelId = 100、LevelTypeId = 3 (C) を使用すると、クエリは次を返す必要があります。

   LevelTypeId    LevelId
   -----------    -------
   3               100
   2               10
   1               1

LevelId = 1000、LevelTypeId = 4 (D) を使用すると、クエリは次を返す必要があります。

   LevelTypeId    LevelId
   -----------    -------
   4               1000
   3               100
   2               10
   1               1

以下のクエリを使用していましたが、特にLevelId = 100、LevelTypeId = 3 でフィルタリングすると、正しい結果が得られません。

select LevelTypeId, LevelId
from
   (    select  
            a.ID as [1], 
            b.ID as [2],
            c.ID as [3], 
            d.ID as [4]
        from A a
        left join B b on a.ID = b.A_ID
        left join C c on b.ID = c.B_ID
        left join D d on c.ID = d.C_ID
        where 
            (@levelTypeId = 4 and D.ID = @levelId)
            or
            (@levelTypeId = 3 and C.ID = @levelId)
            or
            (@levelTypeId = 2 and B.ID = @levelId)
            or
            (@levelTypeId = 1 and A.ID = @levelId)

   ) p   
unpivot
   (LevelId FOR LevelTypeId IN ([1], [2], [3], [4])) AS unpvt

誰でもこのクエリで私を助けることができますか?

4

1 に答える 1

1

where節で唯一のレベル選択が行われているため、既存のクエリは結合内のすべてのレベルを返します。いずれかのレベルが基準に一致する場合、すべてのレベルが選択されます。代わりに、次を試してください。

select LevelTypeId, LevelId
from
   (    select  
            a.ID as [1], 
            b.ID as [2],
            c.ID as [3], 
            d.ID as [4]
        from A a
        left join B b on a.ID = b.A_ID and @levelTypeId >= 2
        left join C c on b.ID = c.B_ID and @levelTypeId >= 3
        left join D d on c.ID = d.C_ID and @levelTypeId >= 4
        where 
            (@levelTypeId = 4 and D.ID = @levelId)
            or
            (@levelTypeId = 3 and C.ID = @levelId)
            or
            (@levelTypeId = 2 and B.ID = @levelId)
            or
            (@levelTypeId = 1 and A.ID = @levelId)

   ) p   
unpivot
   (LevelId FOR LevelTypeId IN ([1], [2], [3], [4])) AS unpvt

ここでSQLFiddle 。

于 2013-06-07T18:25:54.197 に答える