SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE table_names ( items, component ) AS
SELECT 'A', 'A1' FROM DUAL UNION ALL
SELECT 'B1', 'B4' FROM DUAL UNION ALL
SELECT 'B', 'B2' FROM DUAL UNION ALL
SELECT 'B', 'B1' FROM DUAL UNION ALL
SELECT 'B2', 'B4' FROM DUAL UNION ALL
SELECT 'B', 'B3' FROM DUAL;
Запрос 1 :
SELECT LEVEL, t.*
FROM (
SELECT *
FROM table_names
UNION ALL
(
SELECT DISTINCT
component, NULL
FROM table_names
WHERE component NOT IN ( SELECT items FROM table_names )
)
) t
START WITH items NOT IN ( SELECT component FROM table_names )
CONNECT BY PRIOR component = items
Результаты :
| LEVEL | ITEMS | COMPONENT |
|-------|-------|-----------|
| 1 | A | A1 |
| 2 | A1 | (null) |
| 1 | B | B1 |
| 2 | B1 | B4 |
| 3 | B4 | (null) |
| 1 | B | B2 |
| 2 | B2 | B4 |
| 3 | B4 | (null) |
| 1 | B | B3 |
| 2 | B3 | (null) |
Запрос 2 :
SELECT LEVEL, t.*
FROM (
SELECT *
FROM table_names
UNION ALL
(
SELECT DISTINCT
component, NULL
FROM table_names
WHERE component NOT IN ( SELECT items FROM table_names )
)
) t
START WITH items NOT IN ( SELECT component FROM table_names )
CONNECT BY PRIOR component = items
ORDER BY CONNECT_BY_ROOT( items ), LEVEL, items
Результаты :
| LEVEL | ITEMS | COMPONENT |
|-------|-------|-----------|
| 1 | A | A1 |
| 2 | A1 | (null) |
| 1 | B | B3 |
| 1 | B | B1 |
| 1 | B | B2 |
| 2 | B1 | B4 |
| 2 | B2 | B4 |
| 2 | B3 | (null) |
| 3 | B4 | (null) |
| 3 | B4 | (null) |