with
t(c1, c2, path) as (
select col_1, col_2, cast(col_1 as varchar2(1000)) from table_x where col_2 = 1
union all
select col_1, col_2, path||' - '||col_1
from table_x join t on col_2 = c2 + 1 ),
s as (select t.*, row_number() over (order by path) sn from t where c2 = 6),
d as (
select sn, t.c1, t.c2, s.path, count(distinct t.c1) over (partition by sn) cnt
from s join t on s.path like t.path||'%')
select * from d where cnt = 4 order by sn, c2
Демоверсия dbfiddle
t
- рекурсивный запрос, генерирующий все возможные решения из ваших данных, здесьРешения построены как A - D - B - C - A - A
и т. д. s
- t
с добавленным номером решения sn
d
- s
, соединенным с t
(для разворотаданные) и добавленное количество каждой отдельной буквы в решении
Наконец, я выбираю только решения, содержащие все четыре буквы.В данном конкретном случае есть 10 возможных решений, и возьмите все, что захотите.
Вы можете сделать это с любым набором данных, могут быть строки, числа и т. Д., Но сначала вы должны назначить им номера (с row_number ()), чтобы разрешить работу рекурсивного запроса.И в этом случае в запросе вы должны объединить решения с исходными данными, используя эти идентификаторы.
Также здесь я жестко закодировал 6
(цифры) и 4
(буквы), но вы можете легко посчитать их сначала.