-- Migrated from DuckDB test: Self join scenarios
-- Tests self join operations
CREATE TABLE employees_self(
  "id" INTEGER,
  "name" VARCHAR,
  manager_id INTEGER,
  salary INTEGER,
  ts TIMESTAMP TIME INDEX
);

Affected Rows: 0

INSERT INTO employees_self VALUES
(1, 'CEO', NULL, 100000, 1000),
(2, 'Manager1', 1, 80000, 2000),
(3, 'Manager2', 1, 75000, 3000),
(4, 'Employee1', 2, 50000, 4000),
(5, 'Employee2', 2, 55000, 5000),
(6, 'Employee3', 3, 48000, 6000);

Affected Rows: 6

-- Basic self join to get employee-manager pairs
SELECT e."name" as employee, m."name" as manager
FROM employees_self e
LEFT JOIN employees_self m ON e.manager_id = m."id"
ORDER BY e."id";

+-----------+----------+
| employee  | manager  |
+-----------+----------+
| CEO       |          |
| Manager1  | CEO      |
| Manager2  | CEO      |
| Employee1 | Manager1 |
| Employee2 | Manager1 |
| Employee3 | Manager2 |
+-----------+----------+

-- Self join to find employees earning more than their manager
SELECT e."name" as employee, e.salary, m."name" as manager, m.salary as manager_salary
FROM employees_self e
JOIN employees_self m ON e.manager_id = m."id"
WHERE e.salary > m.salary
ORDER BY e."name";

++
++

-- Self join to find colleagues (same manager)
SELECT e1."name" as employee1, e2."name" as employee2, m."name" as shared_manager
FROM employees_self e1
JOIN employees_self e2 ON e1.manager_id = e2.manager_id AND e1."id" < e2."id"
JOIN employees_self m ON e1.manager_id = m."id"
ORDER BY shared_manager, employee1;

+-----------+-----------+----------------+
| employee1 | employee2 | shared_manager |
+-----------+-----------+----------------+
| Manager1  | Manager2  | CEO            |
| Employee1 | Employee2 | Manager1       |
+-----------+-----------+----------------+

-- Hierarchical query using self join
SELECT
  e."name" as employee,
  e.salary,
  m."name" as manager,
  COUNT(sub."id") as direct_reports
FROM employees_self e
LEFT JOIN employees_self m ON e.manager_id = m."id"
LEFT JOIN employees_self sub ON e."id" = sub.manager_id
GROUP BY e."id", e."name", e.salary, m."name"
ORDER BY e."id";

+-----------+--------+----------+----------------+
| employee  | salary | manager  | direct_reports |
+-----------+--------+----------+----------------+
| CEO       | 100000 |          | 2              |
| Manager1  | 80000  | CEO      | 2              |
| Manager2  | 75000  | CEO      | 1              |
| Employee1 | 50000  | Manager1 | 0              |
| Employee2 | 55000  | Manager1 | 0              |
| Employee3 | 48000  | Manager2 | 0              |
+-----------+--------+----------+----------------+

DROP TABLE employees_self;

Affected Rows: 0

