powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможные варианты соединения полей из таблицы
8 сообщений из 8, страница 1 из 1
Возможные варианты соединения полей из таблицы
    #39297305
Azfair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи в работе столкнулся с таким вопросом чот приуныл. собственно есть табличка с одним столбцом из нескольких значений, допустим
a
b
c

Вот думаю как бы сделать так самым простым способом чтобы вывести все возможные комбинации значений этого столбца
типо такого:
a,b,c
a,c,b
b,a,c
b,c,a
c,a,b
c,b,a

есть функция listagg, но она только первую строчку может собрать.
Подскажите плиз.
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297330
Azfair,

_by_cardinality
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297331
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вам, случайно, не такое надо:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH cte(col1)AS
  (
    SELECT 'A'FROM DUAL 
      UNION ALL
    SELECT 'B'FROM DUAL 
      UNION ALL
    SELECT 'C' FROM DUAL
  )
SELECT C.col1,C1.col1,C2.col1
  FROM cte C
  CROSS JOIN cte C1
  CROSS JOIN cte C2
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297335
Azfair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xenix, немного не так, это я уже пробовал спасибо. не должно быть повторений в столбцах и начаных столбцов может быть и два и четыре. спасибо
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297363
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azfair,

придется надеяться на критику опытных форумчан, потому что делал на скорую руку и рекомендую
1) поревьювить и скорее всего что-то подтюнить
2) (более важное) оценить производительность :)

не знаю как, но это работает :D
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
with w_t as (
  select chr(97 + level - 1) as d 
  from dual
  connect by level <= 3
),
w_cross_t(d1, d2, lev) as ( -- умножаем исходный пул данных для формирования сочетаний
  select t1.d, t2.d, 1 
  from 
    w_t t1, w_t t2 -- умножаем
  union all
  select d1, d2, lev + 1 
  from w_cross_t
  where 1 = 1
    and lev + 1 <= (-- столько раз сколько есть уникальных значений в исходном пуле данных
      select count(distinct d) from w_t
    )
),
w_combo_t as ( -- собираем сочетания (тут не уверен что всё правильно, да и производительность надо оценивать)
  select
    t.*, 
    level as l, 
    ltrim(SYS_CONNECT_BY_PATH(case when level = 1 then d1 when CONNECT_BY_ROOT d1 <> d2 then d2 end, ','), ',') as str
  from (
    select distinct
      d1, d2 
    from 
      w_cross_t
  ) t
  connect by nocycle prior t.d2 = t.d1
)
select 
  str
from w_combo_t
where 1 = 1
  -- исключаем кривые сочетания (быть может оптимальнее сделать при формировании w_combo_t)
  and l = (
    select count(distinct d) 
    from 
      w_t
  )
  and substr(str, -1, 1) <> ','
  and regexp_count(str, ',,') = 0
order by 
  str

...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297500
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azfair,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH s_set
     AS (SELECT 'a' AS svalue FROM DUAL
         UNION
         SELECT 'b' AS svalue FROM DUAL
         UNION
         SELECT 'c' AS svalue FROM DUAL
         UNION
         SELECT 'd' AS svalue FROM DUAL)
    SELECT s_set.svalue,
           LTRIM (SYS_CONNECT_BY_PATH (s_set.svalue, ','), ',') AS sresult,
           LEVEL AS nlevel,
           CONNECT_BY_ISLEAF AS nisleaf
      FROM s_set
CONNECT BY NOCYCLE     LEVEL <= (SELECT COUNT (1) FROM s_set)
                   AND PRIOR s_set.svalue <> s_set.svalue



Внешний запрос писать уж не буду
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39297578
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_Sr,

круто!
Что-то такое и я стремился написать, но нагородил лишних заборов :)
...
Рейтинг: 0 / 0
Возможные варианты соединения полей из таблицы
    #39298100
А так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH cte(c)AS
  (
    SELECT 'A'FROM DUAL 
      UNION ALL
    SELECT 'B'FROM DUAL 
      UNION ALL
    SELECT 'C' FROM DUAL
  )
SELECT C.c,C1.c,C2.c
  FROM cte C
  JOIN cte C1 on c1.c <> C.c
  JOIN cte C2 on c2.c <> c1.c and c2.c <> c.c
;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможные варианты соединения полей из таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]