3

次のようなテーブルがあります。

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ます。

すべての値は正であり、クエリは階層のレベルにバインドされるべきではありません。

カーソルを使用したくありません。つまり、この場合はパフォーマンスが非常に重要であるため、セットベースの操作を厳密に使用したいということです。

  1. これは CTE で実行できますか? それとも単純に加入?サブクエリ?ネストされたクエリ?
  2. デザインを改善するための提案はありますか?

階層のレベルに関係なく、回答が必要であることを覚えておいてください。

4

1 に答える 1