ロキ、私は同様のクエリを持っていましたが、それは私が望むように名前でソートされませんでしたが、コードでソートされました-それは金曜日であり、私は過負荷でした。
とにかく、クエリを実行するとエラーが発生しました。キャストする必要があります。私はそれを次のように変更しなければなりませんでした:
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
しかし、キャストする必要があるような解決策は好きではありません。より良い解決策はありますか?