Query Hierarky bias digunakan untuk membantu kita dalam menampilkan data
pegawai dalam suatu struktur hierarky. Dengan struktur hierarky kita lebih mudah
mengetahui komposisi pegawai.
Contoh Query Hierarky kita dapat menggunakan taabel pegawai dengan data
berikut ini :
Dari data diatas sebenarnya terlihat adanya hubungan antara kolom manager_id
dengan kolom id_pegawai. Hubungan kedua kolom tersebut menunjukkan
hubungan antara atasan dan bawahan. Sebagai contoh Meutia (1001) punya
bawahan langsung pegawai 1002, 1003, 1004, dan 1005 yaitu (Budi, Rully, Edwin
dan Novi) tetapi kita akan sulit membaca hal itu karena tampilan data tidak
berbentuk. Jika digambarkan maka struktur hierarki pegawai akan terlihat pada
gambar diatas.
Sebagaimana terlihat pada gambar diatas, elemen atau node tersebut membentuk
struktur hierarki. Node yang ada bisa kita menjadi bagi :
Root mode, yaitu merupakan puncak dari struktur hirarki, pada contoh di
gambar ini 10.1 sebagai root node adalah meutia J.M, yang artinya Meutia
Aris Mursito parent node dari Lia Nurlita dan Heru Kutanto.
Child node, node yang mempuyai parent node diatasnya. Contohnya Lia
hierarchical_query_clause::=
parameter
ini
bersama
dengan
pseudocolumn
lanjut.
Dalam query hirarkis, satu ekspresi dalam kondisi harus memenuhi syarat
dengan operator PRIOR untuk merujuk ke baris induk. Sebagai contoh,
PRIOR adalah operator unary dan memiliki prioritas yang sama dengan +
unary dan - operator aritmatika. Mengevaluasi ekspresi segera setelah
untuk
baris
induk
dari
baris
saat
ini
dalam
query
hirarkis.
valid.
Anda dapat lebih menyempurnakan query hirarkis dengan menggunakan
operator CONNECT_BY_ROOT untuk memenuhi syarat kolom dalam
daftar pilih. Operator ini memperluas fungsionalitas dari CONNECT BY
[PRIOR] kondisi query hirarkis dengan kembali tidak hanya orang tua
baris langsung tetapi semua baris leluhur dalam hirarki.
A bergabung, jika ada, maka dievaluasi dulu, apakah dapat dgabung lalu
Oracle memilih akar baris (s) dari hirarki - baris yang memenuhi MULAI
DENGAN kondisi.
Oracle memilih baris anak setiap baris root. Setiap baris anak harus
memenuhi kondisi CONNECT BY kondisi sehubungan dengan salah satu
baris root.
Oracle memilih generasi-generasi baris anak. Oracle pertama memilih
anak-anak dari baris yang dikembalikan pada langkah 2, dan kemudian
anak-anak dari anak-anak, dan sebagainya. Oracle selalu memilih anakanak dengan mengevaluasi CONNECT BY kondisi sehubungan dengan
Contoh 1
CONNECT
BY
Example The
following
hierarchical
query
uses
EMPLOYEE_ID LAST_NAME
MANAGER_ID
100
108 Greenberg
101
109 Faviet
108
110 Chen
108
111 Sciarra
108
112 Urman
108
113 Popp
108
200 Whalen
101
...
LEVEL Example The next example is similar to the preceding example, but
uses the LEVEL pseudocolumn to show parent and child rows:
SELECT employee_id, last_name, manager_id, LEVEL
FROM employees
CONNECT BY PRIOR employee_id = manager_id;
EMPLOYEE_ID LAST_NAME
MANAGER_ID
LEVEL
...
101 Kochhar
100
108 Greenberg
101
109 Faviet
108
110 Chen
108
111 Sciarra
108
112 Urman
108
113 Popp
108
START WITH Examples The next example adds a START WITH clause to
specify a root row for the hierarchy and an ORDER BY clause using
the SIBLINGS keyword to preserve ordering within the hierarchy:
SELECT last_name, employee_id, manager_id, LEVEL
FROM employees
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id
ORDER SIBLINGS BY last_name;
LAST_NAME
EMPLOYEE_ID MANAGER_ID
LEVEL
100
Cambrault
148
100
Bates
172
148
Bloom
169
148
Fox
170
148
Kumar
173
148
Ozer
168
148
Smith
171
148
De Haan
102
100
Hunold
103
102
Austin
105
103
Ernst
104
103
Lorentz
107
103
Pataballa
106
103
Errazuriz
147
100
Ande
166
147
Banda
167
147
Employee
Cycle
LEVEL Path
2 /King/Russell
Tucker
3 /King/Russell/Tucker
Bernstein
3 /King/Russell/Bernstein
Hall
3 /King/Russell/Hall
Olsen
3 /King/Russell/Olsen
Cambrault
3 /King/Russell/Cambrault
Tuvault
3 /King/Russell/Tuvault
Partners
2 /King/Partners
King
3 /King/Partners/King
Sully
3 /King/Partners/Sully
McEwen
3 /King/Partners/McEwen
...
Employee
Manager
Pathlen Path
Kochhar
1 /Kochhar/Higgins
Gietz
Kochhar
2 /Kochhar/Higgins/Gietz
Gietz
Higgins
1 /Higgins/Gietz
Higgins
King
2 /King/Kochhar/Higgins
Gietz
King
/King/Kochhar/Higgins/Gietz
The following example uses a GROUP BY clause to return the total salary of
each employee in department 110 and all employees below that employee in
the hierarchy:
SELECT name, SUM(salary) "Total_Salary" FROM (
SELECT CONNECT_BY_ROOT last_name as name, Salary
FROM employees
WHERE department_id = 110
CONNECT BY PRIOR employee_id = manager_id)
GROUP BY name;
NAME
Total_Salary
------------------------- -----------Gietz
8300
Higgins
20300
King
20300
Kochhar
20300
(3, 2, 'Kas'),
(4, 2, 'Bank'),
(6, 1, 'Harta
Tetap'),
(7, 6, 'Kendaraan'),
(10, 6, 'Investasi'),
+-----------+----------+--------------------+
| accountId | parentId | accountName
+-----------+----------+--------------------+
|
1 |
0 | Harta
2 |
1 | Harta Lancar
3 |
2 | Kas
4 |
2 | Bank
5 |
2 | Piutang Teman
6 |
1 | Harta Tetap
7 |
6 | Kendaraan
8 |
7 | Vario Matic
9 |
6 | Product Electronic |
10 |
6 | Investasi
11 |
0 | Pendapatan
12 |
11 | Gaji
13 |
12 | Gaji gue
14 |
11 | Hasil Investasi
+-----------+----------+--------------------+
14 rows in set (0.00 sec)
Pada
hasil
bahwa
tiap
item
pada
tabel
Matic adalah
child
child
dari Harta
Tetap dan Harta Tetap adalah child dari Harta yang mana tidak
mempunyai parent lagi alias parent itu sendiri. Walaupun tabel
diatas sudah dapat diterjemahkan, tetapi masih dibutuhkan suatu
query statement agar tampilan data collection lebih mudah untuk
dilihat/dimengerti.
Untuk menampilkan data tersebut dapat kita gunakan LEFT
JOIN :
mysql> SELECT a1.accountName AS Parent, a2.accountName as
Child1,
->
->
FROM account AS a1
->
->
->
->
+------------+-----------------+-------------------+-------------+
| Parent
Child3
| Child1
| Child2
+------------+-----------------+-------------------+-------------+
| Harta
| Harta Lancar
| Kas
| NULL
| Harta Lancar
| Bank
| NULL
| Harta Lancar
| Piutang Teman
| NULL
|
| Harta
|
| Harta
|
| Harta
| Harta Tetap
| Kendaraan
| Vario
| Harta Tetap
| Harta Tetap
| Investasi
| NULL
| Gaji gue
| NULL
Matic |
| Harta
|
| Harta
|
| Pendapatan | Gaji
|
| Pendapatan | Hasil Investasi | NULL
| NULL
+------------+-----------------+-------------------+-------------+
8 rows in set (0.00 sec)
Untuk menampilkan data account yang paling bawah atau account yang
tidak mempunyai child, saya menggunakan LEFT JOIN:
mysql> SELECT aOne.accountName FROM
-> account AS aOne LEFT JOIN account as aTwo
-> ON aOne.accountId = aTwo.parentId
-> WHERE aTwo.accountId IS NULL;
+--------------------+
| accountName
+--------------------+
| Kas
| Bank
| Piutang Teman
| Vario Matic
| Product Electronic |
| Investasi
| Gaji gue
| Hasil Investasi
+--------------------+
8 rows in set (0.00 sec)