Надстройка значения столбца в таблице SQL - PullRequest
2 голосов
/ 11 ноября 2019

Как создать расширенный набор комбинаций значений из (небольшой, около 1-7 строк) таблицы SQL?

например, у меня есть таблица:

MY_PATTERNS
╔═════════╗
║ PATTERN ║
╠═════════╣
║      30 ║
║      60 ║
║      90 ║
╚═════════╝

И мне интересно найти его суперсеть (не чувствительную к порядку):

LISTAGG_PERMUTATIONS
╔══════════════════════╗
║ PATTERN_COMBINATIONS ║
╠══════════════════════╣
║ 30                   ║
║ 30,60                ║
║ 30,60,90             ║
║ 30,90                ║
║ 60,                  ║
║ 60,90                ║
║ 90                   ║
╚══════════════════════╝

Существует ли SQL-запрос для получения этого результата? Пока все мои усилия были тщетны ...

Я использую Oracle 12c

Я не планирую запускать это на наборе, превышающем 6 или 7, так что O(n!) производительность не имеет значения.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Для этого вы можете использовать рекурсивный CTE:

with cte(pattern_combination, l) as (
      select pattern as pattern_combination, pattern as l
      from my_patterns
      union all
      select cte.pattern_combination || ',' || p.pattern, p.pattern
      from cte join
           my_patterns p
           on p.pattern > cte.l
     )
select pattern_combination
from cte

Здесь - это db <> скрипка.

2 голосов
/ 11 ноября 2019

Вы можете просто использовать SYS_CONNECT_BY_PATH следующим образом

SQL> WITH MY_PATTERNS (PATTERN_ )
  2  AS
  3  (
  4  SELECT 30 FROM DUAL UNION ALL
  5  SELECT 60 FROM DUAL UNION ALL
  6  SELECT 90 FROM DUAL
  7  ) -- Your query starts from here
  8  SELECT LTRIM(SYS_CONNECT_BY_PATH(PATTERN_, ','), ',')  AS combination
  9  FROM MY_PATTERNS
 10  CONNECT BY PRIOR PATTERN_ < PATTERN_
 11  ;

COMBINATION
--------------------------------------------------------------------------------
30
30,60
30,60,90
30,90
60
60,90
90

7 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...