7

次の問題があります。階層データを維持するためのテーブルがあります。SQL 2005 の CTE を使用したいと考えています。

WITH tree (id, parentid, code, name) AS
(
    SELECT id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree

しかし、コードで並べ替えたいのですが、結果は次のようになります。

1
1/1
1/1/1
1/1/2
1/2/1
1/2/2
2
4/1

など アイデアはありますか?

4

2 に答える 2

2

ロキ、私は同様のクエリを持っていましたが、それは私が望むように名前でソートされませんでしたが、コードでソートされました-それは金曜日であり、私は過負荷でした。

とにかく、クエリを実行するとエラーが発生しました。キャストする必要があります。私はそれを次のように変更しなければなりませんでした:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, CAST(ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code+'/'+ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

問題は、名前がvarcharであるにもかかわらず、varcharにキャストする必要があることです。大きな木ではvarchar(255)では不十分である可能性があります。

だから私は上記の問題がそれほど大きくないバージョンを作りました:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, 
           CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) 
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, 
           CAST(tree.code +'/' + CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

しかし、キャストする必要があるような解決策は好きではありません。より良い解決策はありますか?

于 2009-01-25T21:04:56.340 に答える