database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40810 게시물 읽기
No. 40810
퀴즈입니다. 부분수열의 순열들을 모두 구하기 (공집합은 제외)
작성자
김흥수(protokhs)
작성일
2015-05-29 02:08
조회수
8,671

{1,2,3}

이 집합으로 주어진 경우

(3),(2),(2,3),(3,2),(1),(1,3),(3,1),(1,2),(2,1),(1,2,3),(2,1,3),(1,3,2),(3,2,1)

을 구하는 것입니다.

자세히 보면 공집합을 제외한 멱집합의 전 순서 순서쌍을 나열한 것입니다.

이 글에 대한 댓글이 총 3건 있습니다.

결과값에  {2,3,1}, {3,1,2}가 빠졌네요.

 

with base_data as (

    select '1,2,3' v from dual

)

, temp as (

 select regexp_substr(t1.v, '[^,]+', 1, level) v

   from base_data t1

connect by level <= length(regexp_replace(t1.v, '[^,]+', ''))+1

)

 select substr(sys_connect_by_path(v, '-'), 2) as path

   from temp x

connect by nocycle prior x.v <> x.v

  order siblings by v

 

팡(pangs)님이 2015-05-29 11:12에 작성한 댓글입니다.
이 댓글은 2015-05-29 11:14에 마지막으로 수정되었습니다.

 아 정말 빠졌네요

 

예 어쨋든 앞의 두 문제의 합성입니다.

김흥수(protokhs)님이 2015-06-01 09:10에 작성한 댓글입니다.
이 댓글은 2015-06-01 09:11에 마지막으로 수정되었습니다.

 제가 생각했던 답입니다.

앞의 두 문제를 합성하였습니다.

with base_data as

 

(

    select 1 v from dual

    union all select 2 v from dual

    union all select 3 v from dual

)

, base_calc as

(

    select

        rownum 부분집합번호

        , sys_connect_by_path(v, ',') v

        , length(sys_connect_by_path(v, ',')) - length(replace(sys_connect_by_path(v, ','),',','') ) len

    from    base_data

    connect by prior v < v

)

, base_recur ( v , len , tar, tarlen,pos ) as

(

    select

        a.v

        ,a.len

        ,substr( a.v , 1 ,nvl(nullif(instr( a.v , ',' , 1,2 ),0),length(a.v)+1) - 1  ) tar

        , 2 tarlen

        , 2 pos

    from    base_calc a

    union all

    select

        a.v

        ,a.len

        ,substr(a.tar,1, nvl(nullif(instr(a.tar,',',1,b.column_value),0),length(a.tar)+1) - 1)||substr(a.v,instr(a.v,',',1,a.pos) , nvl(nullif(instr(a.v,',',1,a.pos+1),0),length(a.v)+1) - instr(a.v,',',1,a.pos) )||substr(a.tar,nvl(nullif(instr(a.tar,',',1,b.column_value),0),length(a.tar) + 1))

        ,a.tarlen + 1

        ,a.pos + 1

    from    base_recur a

            , TABLE(select collect(level) from dual connect by level<= a.tarlen) b 

    where   a.pos <= a.len

)

select

    substr(a.tar,2) tar

from    base_recur a

where   a.len + 1 = a.pos

/

 

그런데 팡님의 방법이 훨씬 간결하고 좋습니다.

김흥수(protokhs)님이 2015-06-04 10:09에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40813UPDATE 쿼리인데 속도 문제 [2]
최인수
2015-06-02
7549
40812쿼리 질문드립니다. [2]
2015-06-02
6767
40811퀴즈입니다. SQL로 구문트리화된 수식을 계산하기 [5]
김흥수
2015-06-01
10317
40810퀴즈입니다. 부분수열의 순열들을 모두 구하기 (공집합은 제외) [3]
김흥수
2015-05-29
8671
40809퀴즈입니다. SQL로 집합의 모든 순서관계 순서쌍 구하기 [4]
김흥수
2015-05-28
8814
40808퀴즈입니다. 공집합을 제외한 모든 멱집합의 원소를 출력하는 SQL [4]
김흥수
2015-05-27
8547
40807모든 테이블에 하나라도 없는 값은 테이블명 출력? [1]
궁금이
2015-05-27
7151
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다