1

読み取り可能な形式で提示したい親子関係を持つ SQL テーブルが与えられました。

関連する主な列は、Drawer、Folder、Document です。各引き出しには複数のフォルダーを関連付けることができ、各フォルダーには複数のドキュメントを関連付けることができます。ただし、フォルダーとドキュメントは同じレコードにリストされません。

このテーブルにはアイテムの種類が含まれており、フォルダーとドキュメントはどちらもアイテムと見なされます。それらを関連付けるために、テーブルはフォルダーの itemnumber をドキュメント レコードの parentID に割り当てます。

例えば:

DrawerID   ItemID    ParentID    Type    Name  
  1          1          0       Folder   Folder 1  
  1          2          0       Folder   Folder 2  
  1          3          0       Folder   Folder 3  
  1          4          0       Folder   Folder 4  
  1          5          1       Document Document A  
  1          6          1       Document Document B   
  1          7          1       Document Document C 
  1          8          2       Document Document A  
  1          9          3       Document Document A  
  1          10         3       Document Document B 

私が探しているのは、次のような出力です。

Drawer 1
    Folder 1
        Document A
        Document B
        Document C
    Folder 2
        Document A
    Folder 3
        Document A
        Document B    

私が立ち往生している部分は、ParentID を ItemID に関連付ける方法です。最善のアプローチは、ある種の組合でしょうか? 新しいテーブルへの再帰的プログラミング? 私は SQL の専門家ではありません。クエリの一部をカット アンド ペーストしただけなので、短い単語を使用してください :)

4

4 に答える 4

0

このクエリは機能するはずで、データに対して SQL Server で問題なくテストされています。基本的には、クエリで 2 つの疑似テーブルを作成して Folder エンティティと Document エンティティを表し、親関係で結合します。

SELECT Folder.DrawerID, Folder.FolderId, Folder.FolderName, Doc.DocumentId, Doc.DocumentName
    FROM 

    (Select DrawerId, ItemId AS FolderId, ParentId, [Name] AS FolderName FROM Drawers WHERE [Type] ='Folder') Folder,

    (Select DrawerId, ItemId AS DocumentId, ParentId, [Name] AS DocumentName FROM Drawers  WHERE [Type] ='Document') Doc

    WHERE Doc.ParentId = Folder.FolderId
    ORDER BY DrawerId, FolderName, DocumentName
于 2012-06-07T20:02:36.353 に答える
0

2 レベルだけ深くする場合は、次のようなデータを作成するのが理にかなっています。

DrawerID    FolderID    ItemId    Description    ...

フォルダー自体のアイテム ID は null またはゼロです。

次に、次のようにクエリできます。

SELECT * FROM table ORDER BY DrawerID, FolderID, ItemID
于 2012-06-07T19:25:44.343 に答える
0

標準 SQL には再帰はありません。

ただし、この種の問題を解決するパターンがいくつかあります。そのうちの 1 つはネストされたセットです。

于 2012-06-07T19:26:03.013 に答える
0

扱っているレベルの数がわかっている場合は、自己結合を使用できます。自己結合では、基本的に同じテーブルが新しいテーブルであると見なし、別の名前 (T2 など) で別名を付けます。この例から始めることができます:

ちなみに、データには奇妙な問題があります。コンセプトを完成させるには、タイプ Drawer ID =0 の単一の行が存在する必要があります。以下のコードを変更するか、エラーを修正する必要があります

select 

T1.name,
T2.name,
T3.name //etc repeat as needed and below

from myTable T1

LEFT OUTER JOIN myTable T2 ON
  T2.ParentID= T1.ItemID

LEFT OUTER JOIN myTable T2 ON
  T2.ParentID= T3.ItemID

group by 1,2,3
于 2012-06-07T20:10:30.567 に答える