Дерево возврата Oracle, имеющее все комбинации - PullRequest
0 голосов
/ 14 октября 2019

Мне нужен запрос, который вернет всех женщин в группе.

Пример таблицы данных (Oracle 11g):

with t as (
  select 'K' as GROUP_NAME, 1 as ELEMENT_ID from dual
  union
  select 'K' as GROUP_NAME, 2 as ELEMENT_ID from dual
  union
  select 'K' as GROUP_NAME, 3 as ELEMENT_ID from dual
  union
  select 'L' as GROUP_NAME, 1 as ELEMENT_ID from dual
  union
  select 'L' as GROUP_NAME, 2 as ELEMENT_ID from dual
  union
  select 'L' as GROUP_NAME, 3 as ELEMENT_ID from dual
  union
  select 'P' as GROUP_NAME, 1 as ELEMENT_ID from dual
  union
  select 'P' as GROUP_NAME, 2 as ELEMENT_ID from dual
  union
  select 'P' as GROUP_NAME, 3 as ELEMENT_ID from dual
)
select * from t

K   1
K   2
K   3
L   1
L   2
L   3
P   1
P   2
P   3

Мне нужно создать дерево со всеми комбинациями безповторяя их в группах (группа K, L, P)

Дерево не должно содержать группу деревьев, т.е. не должно быть дерева с такой ветвью: K1-> L1-> K2

K1
 +-- L1
   +-- P1
   +-- P2
   +-- P3
 +-- L2
   +-- P1
   +-- P2
   +-- P3
 +-- L3
   +-- P1
   +-- P2
   +-- P3
K2
 +-- L1
   +-- P1
   +-- P2
   +-- P3
 +-- L2
   +-- P1
   +-- P2
   +-- P3
 +-- L3
   +-- P1
   +-- P2
   +-- P3
K3
 +-- L1
   +-- P1
   +-- P2
   +-- P3
 +-- L2
   +-- P1
   +-- P2
   +-- P3
 +-- L3
   +-- P1
   +-- P2
   +-- P3
L1
  +-- K1
    +-- P1
    +-- P2
    +-- P3
  +-- K2
   ....

1 Ответ

1 голос
/ 14 октября 2019

Я не хочу отвечать на такой вопрос, поскольку SO не служба написания кода.

Но это простой вопрос, и я считаю, что для борьбы с ним потребуется больше усилий, чем дляпросто ответить, тем более что вы предоставили данные испытаний и ожидаемые результаты.

SELECT ltrim(sys_connect_by_path(group_name || element_id,'-'),'-') FROM t
START WITH t.group_name = 'K'
CONNECT BY ( t.group_name = 'L' AND PRIOR t.group_name = 'K' ) OR ( t.group_name = 'P' 
AND PRIOR t.group_name = 'L');
+-----------+
| TREE_PATH |
+-----------+
| K1        |
| K1-L1     |
| K1-L1-P1  |
| K1-L1-P2  |
| K1-L1-P3  |
| K1-L2     |
| K1-L2-P1  |
| K1-L2-P2  |
| K1-L2-P3  |
| K1-L3     |
| K1-L3-P1  |
| K1-L3-P2  |
| K1-L3-P3  |
| K2        |
| K2-L1     |
| K2-L1-P1  |
| K2-L1-P2  |
| K2-L1-P3  |
| K2-L2     |
| K2-L2-P1  |
| K2-L2-P2  |
| K2-L2-P3  |
| K2-L3     |
| K2-L3-P1  |
| K2-L3-P2  |
| K2-L3-P3  |
| K3        |
| K3-L1     |
| K3-L1-P1  |
| K3-L1-P2  |
| K3-L1-P3  |
| K3-L2     |
| K3-L2-P1  |
| K3-L2-P2  |
| K3-L2-P3  |
| K3-L3     |
| K3-L3-P1  |
| K3-L3-P2  |
| K3-L3-P3  |
+-----------+

Если вы не хотели дерево и просто хотеливсе комбинации, это будет «CROSS JOIN». Вот так:

select * from t k CROSS JOIN t l CROSS JOIN t p
where k.group_name = 'K'
AND l.group_name = 'L'
and p.group_name = 'P'
+------------+------------+--------------+--------------+--------------+--------------+
| GROUP_NAME | ELEMENT_ID | GROUP_NAME_1 | ELEMENT_ID_1 | GROUP_NAME_2 | ELEMENT_ID_2 |
+------------+------------+--------------+--------------+--------------+--------------+
| K          |          1 | L            |            1 | P            |            1 |
| K          |          1 | L            |            1 | P            |            2 |
| K          |          1 | L            |            1 | P            |            3 |
| K          |          1 | L            |            2 | P            |            1 |
| K          |          1 | L            |            2 | P            |            2 |
| K          |          1 | L            |            2 | P            |            3 |
| K          |          1 | L            |            3 | P            |            1 |
| K          |          1 | L            |            3 | P            |            2 |
| K          |          1 | L            |            3 | P            |            3 |
| K          |          2 | L            |            1 | P            |            1 |
| K          |          2 | L            |            1 | P            |            2 |
| K          |          2 | L            |            1 | P            |            3 |
| K          |          2 | L            |            2 | P            |            1 |
| K          |          2 | L            |            2 | P            |            2 |
| K          |          2 | L            |            2 | P            |            3 |
| K          |          2 | L            |            3 | P            |            1 |
| K          |          2 | L            |            3 | P            |            2 |
| K          |          2 | L            |            3 | P            |            3 |
| K          |          3 | L            |            1 | P            |            1 |
| K          |          3 | L            |            1 | P            |            2 |
| K          |          3 | L            |            1 | P            |            3 |
| K          |          3 | L            |            2 | P            |            1 |
| K          |          3 | L            |            2 | P            |            2 |
| K          |          3 | L            |            2 | P            |            3 |
| K          |          3 | L            |            3 | P            |            1 |
| K          |          3 | L            |            3 | P            |            2 |
| K          |          3 | L            |            3 | P            |            3 |
+------------+------------+--------------+--------------+--------------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...