Иерархический SQL-запрос для продуктов - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть таблица для продуктов с такой же концепцией, как показано ниже:

items|component
A    |A1
B1   |B4
B    |B2
B    |B1
B2   |B4
B    |B3

Мне нужен SQL-запрос, который покажет результаты:

items|level|component
A    |1    |A1
A1   |2    |
B    |1    |B1
B    |1    |B2
B    |1    |B3
B1   |2    |B4
B2   |2    |B4
B3   |2    |
B4   |3    |

Может кто-нибудь помочь мне сэтот?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

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) |
0 голосов
/ 10 декабря 2018

Вы имели в виду нечто подобное?

drop table t1;
create table t1 (item varchar2 (10), component varchar2 (10));
insert into t1 values ('A' ,'A1');
insert into t1 values ('B' ,'B1');
insert into t1 values ('B' ,'B2');
insert into t1 values ('B' ,'B3');
insert into t1 values ('B1' ,'B4');
insert into t1 values ('B2' ,'B4');
commit;

select item, level, component from t1 connect by item=prior component;

Если вы действительно хотите добавить те элементы, которые отсутствуют в списке элементов, к элементам, в этом случае SQL может выглядеть следующим образом:

select item, level, component 
from t1 
connect by item=prior component
union all 
select distinct component,1,null from t1 where component not in (select item from t1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...