次のようなテーブルがあります。
CREATE TABLE Hierarchy (EmployeeID int not null, parentID int, orderlimit int)
CREATE TABLE Order (EmployeeID int not null, OrderSize int)
注文の各従業員の承認範囲を示すことになっていますが、従業員マネージャーの ID を同じレコードに保持することにしました。これは、注文が個人の制限を超えた場合、そのマネージャー ( で参照parentID
) が承認する必要があるためです。それ。
再び上位レベルを超えた場合、注文を承認する資格のあるレベルに達するまで、注文はより高いレベルに移動する必要があります。が 1 人で null の場合parentID
、これは彼が管理構造の最高レベルであることを意味します。
明確にするために、これを考慮してください
INSERT INTO Hierarchy values
(1,10,0),
(2,11,0),
(3,12,0),
(10,20,100),
(11,21,300),
(12,22,200),
(20,30,1000),
(21,31,2000),
(22,31,3000),
(30,40,10000),
(31,40,15000),
(40,NULL,NULL)
次のようなものを返すビューを作成します。
EmployeeID ApprovalGoesTo LowerLimit UpperLimit
------------------------------------------------------------
1 10 0 99
1 20 100 999
1 30 1000 9999
1 40 10000 NULL
2 11 0 299
2 21 300 1999
2 31 2000 14999
2 40 15000 NULL
.
.
.
10 10 0 100
10 20 101 1000
10 30 1001 10000
.
.
.
31 31 0 15000
31 40 15001 NULL
40 40 0 NULL
したがって、 の注文 ORDER VALUES (1, 8999)
は に行く必要がありemployeeID : 30
ます。
すべての値は正であり、クエリは階層のレベルにバインドされるべきではありません。
カーソルを使用したくありません。つまり、この場合はパフォーマンスが非常に重要であるため、セットベースの操作を厳密に使用したいということです。
- これは CTE で実行できますか? それとも単純に加入?サブクエリ?ネストされたクエリ?
- デザインを改善するための提案はありますか?
階層のレベルに関係なく、回答が必要であることを覚えておいてください。