0

これは少しばかげているように思えるかもしれませんが、このクエリを一度に解決してみたいと思います。

それ自体にリンクする SQL データベースにテーブルがあります。組織 ID と親組織 ID があります。最上位の組織の親 ID は 0 であり、異なるレベルの各組織には、その上位の組織の 1 つの親組織があります。組織のレベルは、組織レベルと呼ばれるテーブル内の別のフィールドによって決定されていました。ただし、現在は、組織がツリーのどこまで下にあるかによってレベルが決定されます。ある組織に別の親を持つ親がいる場合、その最初の組織はレベル 3 になり、その組織はレベル 2 で親になり、レベル 1 で祖父母になります。

SQL をどのように機能させたいかは理解していますが、問題は、組織とそのレベルを返す一般的な SQL ステートメントを作成することです。XML を使用してこれを行うことにしましたが、これは最良のアイデアではない可能性があります。このような組織構造があるとしましょう。

-Top Org 1
--Second Org 1
--Second Org 2
-Top Org 2
--Second Org 3
--Second Org 4
-Top Org 3
--Second Org 5
--Second Org 6

完了したら、次のような XML をクエリします。

<Organizations>
  <Lvl1 OrgID="1" Name="Top Level 1" Index="1">
    <Lvl2 OrgID="5" Name="Second Level 1" Index="1" />
    <Lvl2 OrgID="6" Name="Second Level 2" Index="2" />
  </Lvl1>
  <Lvl1 OrgID="3" Name="Top Level 2" Index="2">
    <Lvl2 OrgID="7" Name="Second Level 3" Index="1" />
    <Lvl2 OrgID="8" Name="Second Level 4" Index="2" />
  </Lvl1>
  <Lvl1 OrgID="4" Name="Top Level 3" Index="3">
    <Lvl2 OrgID="9" Name="Second Level 5" Index="1" />
    <Lvl2 OrgID="10" Name="Second Level 6" Index="2" />
  </Lvl1>
</Organizations>

クエリするレベルの数がわかっている場合、これを通常どおり行う方法を理解しました。1 番目と 2 番目のレベルを照会する場合は、次のようにします。

SELECT
    Lvl1.Org_ID [@OrgID]
    ,Lvl1.Org_Name [@Name]
    ,Lvl1.Org_SortID [@Index]
    ,(
        SELECT
            Lvl2.Org_ID [@OrgID]
            ,Lvl2.Org_Name [@Name]
            ,Lvl2.Org_SortID [@Index]
        FROM Organizations Lvl2
        WHERE Lvl2.Org_ParentID = Lvl1.Org_ID
        GROUP BY Lvl2.Org_ID, Lvl2.Org_Name, Lvl2.Org_SortID
        ORDER BY Lvl2.Org_SortID
        FOR XML PATH('Lvl2'), TYPE
    )
FROM Organizations Lvl1
INNER JOIN Organizations Child1 ON Lvl1.Org_ID = Child1.Org_ParentID
WHERE Lvl1.Org_ParentID = 0
GROUP BY Lvl1.Org_ID, Lvl1.Org_Name, Lvl1.Org_SortID
ORDER BY Lvl1.Org_SortID
FOR XML PATH('Lvl1'), ROOT('Organizations')

しかし、レベルがいくつになるかわからないことにしましょう。レベルが 2 つしかない場合もあれば、15 レベルある場合もあります。また、すべての組織が同じ数のレベルを持つことはできません。私が知りたいのは、各レコードを再帰的に見て、その下に子があるかどうかを判断する方法があるかどうかです。その場合は、それらの子に対して新しい XML タグを作成し、1 レベル下にドリルダウンして、各子をチェックし、それらに子があるかどうかを確認します。Ect。

おそらく、これを行う良い方法がないか、多くの場合、SQL にこのようなことをさせるには膨大なメモリと時間の浪費になります。しかし、そうでない場合は、可能であることを知らせ、例を示してください。ありがとう!

4

1 に答える 1

2

最近、再帰関数を使用して解決した同様の問題がありました(つまり、それ自体を呼び出します)。

テストは行っていませんが、次のようなものが機能するはずです。

CREATE FUNCTION dbo.GetChildOrganisations (@ParentID INT)
RETURNS XML
AS
BEGIN
    RETURN 
    (   SELECT  Org_ID [@OrgID],
                Org_Name [@Name],
                Org_SortID [@Index],
                dbo.GetChildOrganisations(Org_ID) [ChildOrganisations] 
        FROM    Organizations 
        WHERE   Org_ParentID = @ParentID
        FOR XML PATH('Orgainisations')
    )
END
于 2012-09-26T16:09:06.723 に答える