Вставить несколько значений для нескольких идентификаторов - PullRequest
1 голос
/ 17 июня 2020

Я хотел бы вставить несколько идентификаторов на несколько дат во временную таблицу без добавления INSERT для каждой строки. Вот что я ожидаю найти в своей таблице:

100 | 2020-06-01 17:00:00
100 | 2020-06-02 17:00:00
100 | 2020-06-03 17:00:00
202 | 2020-06-01 17:00:00
202 | 2020-06-02 17:00:00
202 | 2020-06-03 17:00:00
555 | 2020-06-01 17:00:00
555 | 2020-06-02 17:00:00
555 | 2020-06-03 17:00:00

Мой текущий SQL:

select f.id, to_date('2020-06-01 17:00','YYYY-MM-DD HH24:MI') from file_r f;
select f.id, to_date('2020-06-02 17:00','YYYY-MM-DD HH24:MI') from file_r f;
select f.id, to_date('2020-06-03 17:00','YYYY-MM-DD HH24:MI') from file_r f;

Где мои идентификаторы находятся в таблице file_r.

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете сгенерировать значения DATE с помощью CONNECT BY и использовать сгенерированные значения в CROSS JOIN. (Хотя ответ уже есть, возможно, следующий пример немного легче понять.)

Таблица, содержащая уникальные идентификаторы

create table file_r (
  id number unique
) ;

insert into file_r( id )
select 100 from dual union all
select 202 from dual union all
select 555 from dual ;

CTAS ( создать таблицу как select)

-- You can create the temporary table "on the fly"
create table temptbl( tid, tdate )
as
select id, dt 
from (
  ( select id from file_r ) -- unique IDs
  cross join
  ( 
    select 
      to_date( '2020-06-01 17:00','YYYY-MM-DD HH24:MI' ) -- start date/time
      + ( level - 1 ) dt
    from dual
    connect by level <= 3 -- amount of days needed
  ) -- generated DATEs
) ;

-- datatypes of the TEMPTBL
describe temptbl
    Name    Null?      Type 
________ ________ _________ 
TID               NUMBER    
TDATE             DATE  

Query (временная таблица)

select tid
, to_char( tdate, 'YYYY-MM-DD HH24:MI:SS' ) 
from temptbl 
order by 1, 2
;


   TID    TO_CHAR(TDATE,'YYYY-MM-DDHH24:MI:SS') 
______ ________________________________________ 
   100 2020-06-01 17:00:00                      
   100 2020-06-02 17:00:00                      
   100 2020-06-03 17:00:00                      
   202 2020-06-01 17:00:00                      
   202 2020-06-02 17:00:00                      
   202 2020-06-03 17:00:00                      
   555 2020-06-01 17:00:00                      
   555 2020-06-02 17:00:00                      
   555 2020-06-03 17:00:00 

Конечно, вы можете создать TEMPTBL, написав некоторый DDL code, а затем ВСТАВИТЬ В TEMPTBL (вместо CTAS):

-- alternative
create table temptbl(
  tid number
, tdate date
, constraint id_date_unique unique( tid, tdate )
) ;

insert into temptbl( tid, tdate ) -- don't write VALUES ... here!
select id, dt 
from (
  ( select id from file_r ) -- unique IDs
  cross join
  ( 
    select 
      to_date( '2020-06-01 17:00','YYYY-MM-DD HH24:MI' ) 
      + ( level - 1 ) dt
    from dual
    connect by level <= 3
  ) -- generated DATEs
) ;

DBfiddle здесь .

0 голосов
/ 17 июня 2020

Вот один из вариантов:

  • строки 1–5 представляют собой образцы данных, которые у вас уже есть в таблице file_r (поэтому вам не нужно вводить их)
  • запрос, который вам действительно нужен, начинается со строки # 6
    • в соответствии с тем, что вы опубликовали, вы хотите начать с 1-го числа текущего месяца в 17:00 (строка # 7)
    • для каждого ID находится в таблице file_r, вы хотите создать 3 строки (строка # 9)
  • перекрестное соединение с табличной функцией гарантирует, что вы избежите дублирования

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> with file_r (id) as
  2    (select 100 from dual union all
  3     select 202 from dual union all
  4     select 555 from dual
  5    )
  6  select id,
  7         trunc(sysdate, 'mm') + 17/24 + column_value - 1 datum
  8  from file_r cross join table(cast(multiset(select level from dual
  9                                             connect by level <= 3
 10                                            ) as sys.odcinumberlist))
 11  order by id, datum;

        ID DATUM
---------- -------------------
       100 2020-06-01 17:00:00
       100 2020-06-02 17:00:00
       100 2020-06-03 17:00:00
       202 2020-06-01 17:00:00
       202 2020-06-02 17:00:00
       202 2020-06-03 17:00:00
       555 2020-06-01 17:00:00
       555 2020-06-02 17:00:00
       555 2020-06-03 17:00:00

9 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...