私は、刑務所と言えば、場所を保持するテーブルを持っています。階層テーブルの選択
CREATE TABLE [dbo].[Location](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NULL,
[LocationTypeID] [int] NOT NULL,
[GeoLocation] [geometry] NULL,
[Name] [varchar](50) NOT NULL,
[Description] [varchar](100) NOT NULL
CONSTRAINT [pk_location] PRIMARY KEY (ID)
)
データファイルここに挿入します。 data.sql file をのParentIDがnullの場合は、それがシステムのルート・ノードです。データは
、我々は刑務所(のTypeID = 5)、建物(のTypeID = 6)、床、細胞及び床を有していてもよいです。親IDは、現在の場所が存在する場所です。
私は、この表に簡単にアクセスできるようにビューを作成しました。
CREATE VIEW [dbo].[vwLocations]
AS
WITH MyLocation
AS (
SELECT ParentID,
ID,
Name,
0 AS LevelNo,
CAST(CAST(LocationTypeID AS VARCHAR) + '|' + Name AS VARCHAR(512)) AS SORT_PATH
FROM dbo.Location AS A
WHERE (ParentID IS NULL)
UNION ALL
SELECT C.ParentID,
C.ID,
C.Name,
MyLocation_1.LevelNo + 1 AS Expr1,
CAST(MyLocation_1.SORT_PATH + '//' + CAST(C.LocationTypeID AS VARCHAR) + '|' + C.Name AS VARCHAR(512)) AS SORT_PATH
FROM dbo.Location AS C
INNER JOIN MyLocation AS MyLocation_1
ON MyLocation_1.ID = C.ParentID
)
SELECT ISNULL(ID, -999) AS LocationID,
ParentID,
LevelNo AS LevelNumber,
SORT_PATH AS FullPath,
Name AS Description
FROM MyLocation AS ML
GO
これはうまく機能し、すべてのケースで効率的です。開発者は、各コンポーネントに分割したい場合、文字列を取得します。例えば、私は、文字列を返す:|刑務所// 6 |
5をP 1 // 7 | P 1 // 8 | // 9 1 | 01 // 10 | 01
彼らその後、
5を取得するための '//' でスプリット|刑務所 6は、| P 1 7 | P 1 8 | 1 9 | 01 10 | 01
意味し、ID 5は、そのことを意味刑務所、ID 6は建物、ID 7はセクション、ID 8は床、9はセル、10はベッドです。
これらはコード内で行います。
問題は、それらが、例えば、フロアでソートできるようにしたいです。それはできません。何とかしなければならないのは、「Prison」、「Building ...」などと呼ばれる行ごとに余分な列を追加し、それらを移入することです。場所はフロアであれば、例えば、その後、刑務所、ビル、セクションおよびフロア列がデータを持っていますが、残りはnullになりますので、nullの場合も
ので、いくつか。
これは可能ですか?
フィールドを別のフィールドに部分文字列で入力し、ビューとして保存してから、ビュー内の新しいフロア列をソートしましたか? – JLB
@JLB - 私はそれを試みようとしていましたが、それでもビューで行うことはできますか?それは 'CASE'声明でしょうか?しかし、たとえそれがあったとしても、私はCASE文をどのように使用して、異なる列に値を設定できるかはわかりません。または、CASEが最終的な選択であり、5列のCASESステートメントが各列に1つずつありますか?または、2つのビュー、これがプライマリ・データ抽出であること、そして2番目のビューで何らかのソートが行われているということですか? – Craig
リクエストを正しく読んでいる場合は、階層の幅優先検索(BFS)を要求しています。もしそうなら、いくつかのサンプルデータを(私はSSMSにコピーして貼り付けることができ、そこからテーブルを得ることができるような形式で提供することが望ましい)、私はあなたにBFS命令の結果セットを与えるコードを提供することができます。 –