Это сделало трюк для меня, используя рекурсивный WITH
.
Обратите внимание, что я не получал повторений и всех перестановок, поэтому запрос не возвращается, например, 1+2
и , так как они - одно и то же.
Мы получаем каждое уникальное сочетание как Varchar2
(переименованный в expression
ниже), а затем просто извлечь число из этого Varchar2
(как создавать строки со значениями, расщепленных характером +
), а затем получить их SUM
.
Я выбираю row_number()
, упорядоченный по val
, так что результаты будут отображаться в порядке, начиная с 1 до последнего номера, независимо от порядка, в котором они были вставлены в базу данных.
Другая проблема заключается в том, что если числа в вашей таблице не уникальны, они будут генерировать дубликаты. Таким образом, это будет работать, только если у вас нет дубликатов в таблице чисел. Если у вас есть дубликаты в таблице, одним из способов исправить это было бы добавить предложение distinct
в запросе (я добавил его в код ниже для справки)
Это может быть не лучшее решение, и Я уверен, что есть, вероятно, лучшие альтернативы, но это то, что я мог бы найти в кратчайшие сроки.
Попробуйте:
SELECT distinct expression,
( SELECT SUM (REGEXP_SUBSTR (expression,
'[^+]+',
1,
LEVEL))
FROM DUAL
CONNECT BY REGEXP_SUBSTR (expression,
'[^+]+',
1,
LEVEL)
IS NOT NULL)
AS THE_SUM
FROM (WITH t
AS ( SELECT ROW_NUMBER() OVER (ORDER BY val) AS seqno,
val AS expression
FROM my_numbers
ORDER BY val ASC),
t2 (s, t)
AS (SELECT seqno, CAST (expression AS VARCHAR2 (1)) FROM t
UNION ALL
SELECT t.seqno, t || '+' || expression
FROM t, t2
WHERE s < seqno)
SELECT s, t expression
FROM t2)
ORDER BY 1
Содержание my_numbers
таблицы:
VAL
4
8
2
1
Выход:
EXPRESSION | THE_SUM
1 | 1
1+2 | 3
1+2+4 | 7
1+2+4+8 | 15
1+2+8 | 11
1+4 | 5
1+4+8 | 13
1+8 | 9
2 | 2
2+4 | 6
2+4+8 | 14
2+8 | 10
4 | 4
4+8 | 12
8 | 8
Какую версию Oracle у вас есть? И, если у вас в таблице больше пары десятков строк, результат будет слишком большим для вас, чтобы что-либо сделать. –
Oracle 11g. Таблица будет иметь 5-10 записей –