Возврат нескольких строк на основе сохраненного значения, умноженного на возможные параметры - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь вернуть несколько строк информации, которые впоследствии могут быть ранжированы. У меня есть таблица продуктов (PRODUCT), в которой сохранены product_id (PRODUCT_ID) и единичный вес (PROD_UNIT_WGT), для которых я хотел бы вернуть возможные количества упаковки, скажем, 1,2,3,4,5,6,7,8, et c до 310. Это возможно без 309 союзов?

Возврат должен быть таким же, как

select PRODUCT_ID, PROD_UNIT_WGT, 1 as QUANTITY, PROD_UNIT_WGT * 1 as TOTAL_WGT
from PRODUCT
where PRODUCT_ID = PROD_A
union
select PRODUCT_ID, PROD_UNIT_WGT, 2 as QUANTITY, PROD_UNIT_WGT * 2 as TOTAL_WGT
from PRODUCT
where PRODUCT_ID = PROD_A
union
select PRODUCT_ID, PROD_UNIT_WGT, 3 as QUANTITY, PROD_UNIT_WGT * 3 as TOTAL_WGT
from PRODUCT
where PRODUCT_ID = PROD_A

Заранее спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 06 января 2020

Создайте таблицу или временную таблицу и l oop через ваши продукты. Пример кода ниже, я сделал это через Oracle Live SQL:

create global temporary table product(
    product_id NUMBER primary key,
    prod_unit_wgt NUMBER)
    on commit preserve rows;

create global temporary table temp_product(
    product_id NUMBER,
    prod_unit_wgt NUMBER,
    quantity NUMBER,
    total_wgt NUMBER,
    constraint pk_temp_product primary key (product_id, quantity))
    on commit preserve rows;

declare
    cursor product_cur is
        select product_id, prod_unit_wgt
          from product;

begin
    insert into product values(1, 3);
    for rec in product_cur loop
        for i in 1..310 loop
            insert into temp_product(product_id, prod_unit_wgt, quantity, total_wgt)
            values ( rec.product_id, rec.prod_unit_wgt, i, rec.prod_unit_wgt * i);
        end loop;
    end loop;
end;

select * from temp_product;

PRODUCT_ID  PROD_UNIT_WGT   QUANTITY    TOTAL_WGT
1   3   1   3
1   3   2   6
1   3   3   9
1   3   4   12
0 голосов
/ 06 января 2020

Как насчет написания запроса, который пишет запрос для вас? Я ограничил его 3 (см. Предложение connect by в строке № 9) для лучшей читаемости; Вы будете использовать любой номер, который хотите.

SQL> with data as
  2    (select 'select product_id, ' || chr(10) ||
  3            '  prod_unit_wgt, '   || level || ' as quantity, ' || chr(10) ||
  4            '  prod_unit_wgt * '  || level || ' as total_wgt ' || chr(10) ||
  5            'from PRODUCT where PRODUCT_ID = PROD_A '          || chr(10) ||
  6            'union all ' val,
  7            level lvl
  8     from dual
  9     connect by level <= 3
 10    )
 11  select rtrim (
 12                xmlagg (xmlelement (e, val || chr(10)) order by lvl).extract (
 13                   '//text()'),
 14                chr(10) || 'union all ')
 15                result
 16  from data;

RESULT
--------------------------------------------------------------------------------
select product_id,
  prod_unit_wgt, 1 as quantity,
  prod_unit_wgt * 1 as total_wgt
from PRODUCT where PRODUCT_ID = PROD_A
union all
select product_id,
  prod_unit_wgt, 2 as quantity,
  prod_unit_wgt * 2 as total_wgt
from PRODUCT where PRODUCT_ID = PROD_A
union all
select product_id,
  prod_unit_wgt, 3 as quantity,
  prod_unit_wgt * 3 as total_wgt
from PRODUCT where PRODUCT_ID = PROD_A


SQL>
0 голосов
/ 06 января 2020

Вы можете попробовать использовать псевдостолбец ROWNUM.

select PRODUCT_ID, PROD_UNIT_WGT, rownum as QUANTITY, PROD_UNIT_WGT * rownum as TOTAL_WGT
from PRODUCT
where PRODUCT_ID = PROD_A
and rownum < 311
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...