|
3.24.1 Recursive UNION [Top]
-----------------------------------------------------------------------------------
CREATE TABLE employee (
employee_id INTEGER NOT NULL,
manager_id INTEGER NOT NULL REFERENCES employee ( employee_id ),
name VARCHAR ( 20 ) NOT NULL,
salary NUMERIC ( 20, 2 ) NOT NULL,
PRIMARY KEY ( employee_id ) );
INSERT INTO employee VALUES ( 1, 1, 'Ainslie', 1000000.00 );
INSERT INTO employee VALUES ( 2, 1, 'Briana', 900000.00 );
INSERT INTO employee VALUES ( 3, 1, 'Calista', 900000.00 );
INSERT INTO employee VALUES ( 4, 1, 'Delmar', 900000.00 );
INSERT INTO employee VALUES ( 5, 2, 'Electra', 750000.00 );
INSERT INTO employee VALUES ( 6, 3, 'Fabriane', 800000.00 );
INSERT INTO employee VALUES ( 7, 3, 'Genevieve', 750000.00 );
INSERT INTO employee VALUES ( 8, 4, 'Hunter', 800000.00 );
INSERT INTO employee VALUES ( 9, 6, 'Inari', 500000.00 );
INSERT INTO employee VALUES ( 10, 6, 'Jordan', 100000.00 );
INSERT INTO employee VALUES ( 11, 8, 'Khalil', 100000.00 );
INSERT INTO employee VALUES ( 12, 8, 'Lisette', 100000.00 );
INSERT INTO employee VALUES ( 13, 10, 'Marlon', 100000.00 );
INSERT INTO employee VALUES ( 14, 10, 'Nissa', 100000.00 );
-----------------------------------------------------------------------------------
WITH RECURSIVE superior_list
( level,
chosen_employee_id,
manager_id,
employee_id,
name )
AS ( SELECT CAST ( 1 AS INTEGER ) AS level,
employee.employee_id AS chosen_employee_id,
employee.manager_id AS manager_id,
employee.employee_id AS employee_id,
employee.name AS name
FROM employee
UNION ALL
SELECT superior_list.level + 1,
superior_list.chosen_employee_id,
employee.manager_id,
employee.employee_id,
employee.name
FROM superior_list
INNER JOIN employee
ON employee.employee_id = superior_list.manager_id
WHERE superior_list.level <= 99
AND superior_list.manager_id <> superior_list.employee_id )
SELECT superior_list.level,
superior_list.name
FROM superior_list
WHERE superior_list.chosen_employee_id = 13
ORDER BY superior_list.level DESC;
-----------------------------------------------------------------------------------
CREATE VIEW v_superior_list AS
WITH RECURSIVE superior_list
( level,
chosen_employee_id,
manager_id,
employee_id,
name )
AS ( SELECT CAST ( 1 AS INTEGER ) AS level,
employee.employee_id AS chosen_employee_id,
employee.manager_id AS manager_id,
employee.employee_id AS employee_id,
employee.name AS name
FROM employee
UNION ALL
SELECT superior_list.level + 1,
superior_list.chosen_employee_id,
employee.manager_id,
employee.employee_id,
employee.name
FROM superior_list
INNER JOIN employee
ON employee.employee_id = superior_list.manager_id
WHERE superior_list.level <= 99
AND superior_list.manager_id <> superior_list.employee_id )
SELECT *
FROM superior_list;
-----------------------------------------------------------------------------------
SELECT v_superior_list.level,
v_superior_list.name
FROM v_superior_list
WHERE v_superior_list.chosen_employee_id = 13
ORDER BY v_superior_list.level DESC;
-----------------------------------------------------------------------------------
SELECT LIST ( v_superior_list.name,
', then '
ORDER BY v_superior_list.level ASC ) AS "Khalil's Superiors"
FROM v_superior_list
WHERE v_superior_list.chosen_employee_id = 11
AND v_superior_list.level > 1;
-----------------------------------------------------------------------------------
CREATE VIEW v_salary_list AS
WITH RECURSIVE salary_list
( level,
chosen_employee_id,
manager_id,
employee_id,
name,
salary )
AS ( SELECT CAST ( 1 AS INTEGER ) AS level,
employee.employee_id AS chosen_employee_id,
employee.manager_id AS manager_id,
employee.employee_id AS employee_id,
employee.name AS name,
employee.salary AS salary
FROM employee
UNION ALL
SELECT salary_list.level + 1,
salary_list.chosen_employee_id,
employee.manager_id,
employee.employee_id,
employee.name,
employee.salary
FROM salary_list
INNER JOIN employee
ON employee.manager_id = salary_list.employee_id
WHERE salary_list.level <= 99
AND employee.manager_id <> employee.employee_id )
SELECT *
FROM salary_list;
-----------------------------------------------------------------------------------
SELECT employee.name,
( SELECT SUM ( v_salary_list.salary )
FROM v_salary_list
WHERE v_salary_list.chosen_employee_id
= employee.employee_id ) AS payroll
FROM employee
ORDER BY 1;
----------------------------------------------------------------------------------- |
|