programing

행 자체의 수량 필드를 기준으로 동일한 행을 여러 개 반환하려면 어떻게 해야 합니까?

lovejava 2023. 9. 16. 08:19

행 자체의 수량 필드를 기준으로 동일한 행을 여러 개 반환하려면 어떻게 해야 합니까?

저는 오라클을 사용하여 쇼핑 앱에서 라인 아이템을 출력하고 있습니다.각 품목에는 1보다 큰 수량 필드가 있고, 만약 그렇다면 그 행을 N번 반품하고 싶습니다.

제가 말씀드리는 테이블은 이렇습니다.

product_id, quanity
1, 3,
2, 5

그리고 나는 다시 돌아올 수 있는 질문을 찾고 있습니다.

1,3
1,3
1,3
2,5
2,5
2,5
2,5
2,5

가능한가요?SQL Server 2005에 대한 이 답변을 보고 오라클에서 거의 정확한 내용을 찾고 있습니다.불행하게도 전용 번호표를 만드는 것은 선택 사항이 아닙니다.

예를 들어 최대치로 15개를 사용했는데, 9999개 또는 최대치를 지원하는 수량으로 설정해주셔야 합니다.

create table t (product_id number, quantity number);
insert into t values (1,3);
insert into t values (2,5);

select t.* 
  from t 
    join (select rownum rn from dual connect by level < 15) a 
                                 on a.rn <= t.quantity
order by 1;

먼저 샘플 데이터를 만듭니다.

create table my_table (product_id number , quantity number);
insert into my_table(product_id, quantity) values(1,3);
insert into my_table(product_id, quantity) values(2,5);

이제 다음 SQL을 실행합니다.

  SELECT product_id, quantity
    FROM my_table tproducts
        ,(    SELECT LEVEL AS lvl
                FROM dual
          CONNECT BY LEVEL <=  (SELECT MAX(quantity) FROM my_table)) tbl_sub
   WHERE tbl_sub.lvl BETWEEN 1 AND tproducts.quantity
ORDER BY product_id, lvl;

PRODUCT_ID   QUANTITY
---------- ----------
         1          3
         1          3
         1          3
         2          5
         2          5
         2          5
         2          5
         2          5

이 질문은 오라클에서 범위를 계산하는 방법과 동일할 수 있습니다.

Oracle 9i에 대한 솔루션 업데이트:

pipelineed_function()은 다음과 같이 사용할 수 있습니다.

CREATE TYPE SampleType AS OBJECT
(
  product_id number,
  quantity varchar2(2000)
)
/

CREATE TYPE SampleTypeSet AS TABLE OF SampleType
/

CREATE OR REPLACE FUNCTION GET_DATA RETURN SampleTypeSet
PIPELINED
IS
    l_one_row SampleType := SampleType(NULL, NULL);

BEGIN

    FOR cur_data IN (SELECT product_id, quantity FROM my_table ORDER BY product_id) LOOP
        FOR i IN 1..cur_data.quantity LOOP
            l_one_row.product_id := cur_data.product_id;
            l_one_row.quantity := cur_data.quantity;
            PIPE ROW(l_one_row);
        END LOOP;
    END LOOP;

    RETURN;
END GET_DATA;
/

이제 다음을 수행할 수 있습니다.

SELECT * FROM TABLE(GET_DATA());

또는 이것:

CREATE OR REPLACE VIEW VIEW_ALL_DATA AS SELECT * FROM TABLE(GET_DATA());
SELECT * FROM VIEW_ALL_DATA;

둘 다 같은 결과입니다.

(내 기사 파이프라인 기능 기준)

언급URL : https://stackoverflow.com/questions/3664903/how-can-i-return-multiple-identical-rows-based-on-a-quantity-field-in-the-row-it