入れ子集合モデルにおける検索
ルートとリーフを求める
まず入れ子集合の検索で基本となる考え方を理解しましょう。それは
たとえば、
SELECT *
FROM OrgChart Boss
WHERE NOT EXISTS
(SELECT *
FROM OrgChart Workers
WHERE Workers.lft > Boss.lft
AND Workers.lft < Boss.rgt);
| emp | lft | rgt |
|---|---|---|
| 猪狩 | 2 | 3 |
| 木島 | 6 | 7 |
| 大神 | 9 | 10 |
| 加藤 | 11 | 12 |
反対に、
このように、
SELECT *
FROM OrgChart Workers
WHERE NOT EXISTS
(SELECT *
FROM OrgChart Boss
WHERE Workers.lft > Boss.lft
AND Workers.lft < Boss.rgt);
| emp | lft | rgt |
|---|---|---|
| 足立 | 1 | 14 |
ノードのレベルを求める
次に、
SELECT Children.emp , COUNT(Parents.emp) AS level
FROM OrgChart Parents, OrgChart Children
WHERE Children.lft BETWEEN Parents.lft AND Parents.rgt
GROUP BY Children.emp;
| emp | level |
|---|---|
| 足立 | 1 |
| 上田 | 2 |
| 猪狩 | 2 |
| 江崎 | 3 |
| 加藤 | 3 |
| 大神 | 3 |
| 木島 | 4 |
「自分」
直属の上司・部下を調べる
隣接リストモデルの場合、
まず、
SELECT Boss.emp AS boss, Worker.emp AS worker
FROM OrgChart Boss
LEFT OUTER JOIN OrgChart Worker
ON Boss.lft = (SELECT MAX(lft) ←左端座標が最大
FROM OrgChart
WHERE Worker.lft > lft
AND Worker.lft < rgt);
| emp | worker |
|---|---|
| 足立 | 猪狩 |
| 足立 | 上田 |
| 猪狩 | |
| 上田 | 江崎 |
| 上田 | 大神 |
| 上田 | 加藤 |
| 江崎 | 木島 |
| 大神 | |
| 加藤 | |
| 木島 |
外部結合を使っているのは、
SELECT Worker.emp AS worker, Boss.emp AS boss
FROM OrgChart Worker
LEFT OUTER JOIN OrgChart Boss
ON Boss.lft < Worker.lft
AND Boss.lft = (SELECT MAX(lft)
FROM OrgChart
WHERE Worker.lft > lft
AND Worker.lft < rgt);
| emp | boss |
|---|---|
| 足立 | |
| 猪狩 | 足立 |
| 上田 | 足立 |
| 江崎 | 上田 |
| 大神 | 江崎 |
| 加藤 | 上田 |
| 木島 | 上田 |
今度は、
