入れ子集合モデルにおける検索
ルートとリーフを求める
まず入れ子集合の検索で基本となる考え方を理解しましょう。それは
たとえば、
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 |
---|---|
足立 | |
猪狩 | 足立 |
上田 | 足立 |
江崎 | 上田 |
大神 | 江崎 |
加藤 | 上田 |
木島 | 上田 |
今度は、