मैं एक (छोटी, लगभग 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
coderatchet 11 नवम्बर 2019, 06:29

2 जवाब

सबसे बढ़िया उत्तर

आप इसके लिए एक पुनरावर्ती 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<>fiddle है।

3
Gordon Linoff 11 नवम्बर 2019, 06:38

आप निम्न के रूप में बस 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>
2
Popeye 11 नवम्बर 2019, 08:35