SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TYPE number_table AS TABLE OF NUMBER;
CREATE TABLE relationships (child_id, father_id ) AS
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 3, 2 FROM DUAL UNION ALL
SELECT 4, 3 FROM DUAL UNION ALL
SELECT 5, 4 FROM DUAL UNION ALL
SELECT 6, 2 FROM DUAL UNION ALL
SELECT 7, 3 FROM DUAL UNION ALL
SELECT 8, 3 FROM DUAL UNION ALL
SELECT 9, 7 FROM DUAL;
Запрос 1 :
SELECT n.COLUMN_VALUE ||' IS THE NEPHEW OF ' || u.COLUMN_VALUE AS nephew
FROM (
SELECT children AS nephews,
PRIOR CHILDREN MULTISET EXCEPT NUMBER_TABLE( father_id ) AS uncles
FROM (
SELECT father_id,
CAST( COLLECT( child_id ORDER BY child_id ) AS number_table ) AS children
FROM relationships
GROUP BY father_id
)
WHERE LEVEL = 2
CONNECT BY father_id MEMBER OF PRIOR children
) t
CROSS JOIN TABLE( t.nephews ) n
CROSS JOIN TABLE( t.uncles ) u
Результаты :
| NEPHEW |
|----------------------|
| 4 IS THE NEPHEW OF 6 |
| 7 IS THE NEPHEW OF 6 |
| 8 IS THE NEPHEW OF 6 |
| 5 IS THE NEPHEW OF 7 |
| 5 IS THE NEPHEW OF 8 |
| 9 IS THE NEPHEW OF 4 |
| 9 IS THE NEPHEW OF 8 |
Запрос 2 :
SELECT PRIOR father_id || ' IS THE GRANDFATHER OF ' || child_id AS grandfather
FROM relationships
WHERE LEVEL = 2
CONNECT BY father_id = PRIOR child_id
Результаты :
| GRANDFATHER |
|---------------------------|
| 1 IS THE GRANDFATHER OF 3 |
| 1 IS THE GRANDFATHER OF 6 |
| 2 IS THE GRANDFATHER OF 4 |
| 2 IS THE GRANDFATHER OF 8 |
| 2 IS THE GRANDFATHER OF 7 |
| 3 IS THE GRANDFATHER OF 5 |
| 3 IS THE GRANDFATHER OF 9 |