복붙노트

[SQL] 컬럼의 값에 따라 오라클 쿼리의 결과를 전개하는 방법

SQL

컬럼의 값에 따라 오라클 쿼리의 결과를 전개하는 방법

나는 두 개의 열이있는 오라클 DB의 테이블이 있습니다. 나는 두 번째 열에 저장된 번호와 같은 횟수만큼 반복되는 모든 행을보고 싶습니다. 표는 다음과 같습니다 :

col1 col2  
a    2  
b    3  
c    1

나는이 반환하는 쿼리를 작성합니다 :

col1 col2
a    2  
a    2   
b    3    
b    3    
b    3    
c    1

COL2 지시의 값 그래서 횟수는 행이 반복됩니다. 이를 달성하는 간단한 방법이 있나요?

감사!

해결법

  1. ==============================

    1.SQL 바이올린

    SQL 바이올린

    오라클 11g R2 스키마 설정 :

    CREATE TABLE test ( col1, col2 ) AS
              SELECT 'a', 2 FROM DUAL
    UNION ALL SELECT 'b', 3 FROM DUAL
    UNION ALL SELECT 'c', 1 FROM DUAL
    

    쿼리 1 :

    SELECT col1,
           col2
    FROM   test t,
           TABLE(
             CAST( 
               MULTISET(
                 SELECT LEVEL
                 FROM   DUAL
                 CONNECT BY LEVEL <= t.col2
               )
               AS SYS.ODCINUMBERLIST
             )
           )
    

    결과 :

    | COL1 | COL2 |
    |------|------|
    |    a |    2 |
    |    a |    2 |
    |    b |    3 |
    |    b |    3 |
    |    b |    3 |
    |    c |    1 |
    
  2. ==============================

    2.A는 테이블의 경우, 당신은 할 수 있습니다 :

    A는 테이블의 경우, 당신은 할 수 있습니다 :

    select a1.col1 , a1.col2 
          from a a1
          join  (select level col2  from dual 
          connect by level < ( select max(col2) + 1 from a))   a2
          on a2.col2 between 1 and a1.col2
    
  3. ==============================

    3.

    with src (col1, col2) as (
        SELECT 'a', 2 FROM DUAL UNION ALL
        SELECT 'b', 3 FROM DUAL UNION ALL
        SELECT 'c', 1 FROM DUAL
    )
    SELECT
        src.*
    FROM
        src
        JOIN (
            SELECT LEVEL val FROM DUAL
            CONNECT BY LEVEL <= (SELECT MAX(col2) FROM src)
        ) gen ON gen.val <= src.COL2
    ORDER BY
        src.col1
    

    또는 Oracle 12에서 사용할 수 있습니다

    with src (col1, col2) as (
        SELECT 'a', 2 FROM DUAL UNION ALL
        SELECT 'b', 3 FROM DUAL UNION ALL
        SELECT 'c', 1 FROM DUAL
    )
    SELECT
        src.*
    FROM
        src
        CROSS APPLY (SELECT NULL FROM DUAL CONNECT BY LEVEL <= src.col2)
    ORDER BY
        col1;
    
  4. ==============================

    4.여기에 대안의 그 COL1을 가정하는 것이 유일하다, (난 그냥 다른 열이 존재할 수 있음을 보여주기 위해 여분의 열을 추가 한) :

    여기에 대안의 그 COL1을 가정하는 것이 유일하다, (난 그냥 다른 열이 존재할 수 있음을 보여주기 위해 여분의 열을 추가 한) :

    with src (col1, col2, col3) as (
        SELECT 'a', 'b', 2 FROM DUAL UNION ALL
        SELECT 'b', 'c', 3 FROM DUAL UNION ALL
        SELECT 'c', 'd', 1 FROM DUAL
    )
    select col1, col2, col3
    from   src
    connect by level <= col3
               and prior col1 = col1
               and prior sys_guid() is not null;
    
    COL1 COL2       COL3
    ---- ---- ----------
    a    b             2
    a    b             2
    b    c             3
    b    c             3
    b    c             3
    c    d             1
    
  5. from https://stackoverflow.com/questions/32522718/how-to-unfold-the-results-of-an-oracle-query-based-on-the-value-of-a-column by cc-by-sa and MIT license