Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможные варианты соединения полей из таблицы / 8 сообщений из 8, страница 1 из 1
24.08.2016, 18:30:57
    #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
24.08.2016, 19:28:01
    #39297330
Возможные варианты соединения полей из таблицы
Azfair,

_by_cardinality
...
Рейтинг: 0 / 0
24.08.2016, 19:29:48
    #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
24.08.2016, 19:40:26
    #39297335
Azfair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможные варианты соединения полей из таблицы
xenix, немного не так, это я уже пробовал спасибо. не должно быть повторений в столбцах и начаных столбцов может быть и два и четыре. спасибо
...
Рейтинг: 0 / 0
24.08.2016, 20:45:41
    #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
25.08.2016, 05:42:33
    #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
25.08.2016, 09:54:31
    #39297578
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможные варианты соединения полей из таблицы
AnSi_Sr,

круто!
Что-то такое и я стремился написать, но нагородил лишних заборов :)
...
Рейтинг: 0 / 0
25.08.2016, 16:48:00
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможные варианты соединения полей из таблицы / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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