如何将查询结果插入全局临时表?

问题描述 投票:0回答:1
create global temporary table temptbl (id )

 as

  WITH t1(id, REFERENCE_ORDER_ID) AS (

  SELECT id,
         REFERENCE_ORDER_ID
  FROM   CALL_MASTER
  WHERE  REFERENCE_ORDER_ID = '1761' or id = '1761'   -- 1654 1760
  UNION ALL

  SELECT t2.id,
         t2.REFERENCE_ORDER_ID
  FROM   CALL_MASTER t2, t1
  WHERE   t2.id = t1.REFERENCE_ORDER_ID 
  ), tt(id, REFERENCE_ORDER_ID) AS (

  SELECT id,
         REFERENCE_ORDER_ID
  FROM   CALL_MASTER
  WHERE  REFERENCE_ORDER_ID = '1761' or id = '1761'   -- 1654 1760
  UNION ALL

  SELECT t2.id,
         t2.REFERENCE_ORDER_ID
  FROM   CALL_MASTER t2, tt
  WHERE   t2.REFERENCE_ORDER_ID = tt.id
  )
  --insert into temptbl values  

  insert into temptable   select * from  
 --select into temptable  select * from   
(
select distinct id  FROM   t1;
union
select distinct id  FROM   tt; 
);
--insert  into temptable  values(id); 


select * from temptbl;
sql oracle oracle11g temp-tables
1个回答
1
投票

虽然您可以使用create-table-as-select(CTAS)语法创建全局临时表,但是将with子句放在正确的位置:

create global temporary table temptbl (id) as
with t1(id, reference_order_id) as (
  select id,
         reference_order_id
  from   call_master
  where  reference_order_id = '1761' or id = '1761'   -- 1654 1760
  union all
  select t2.id,
         t2.reference_order_id
  from   call_master t2, t1
  where  t2.id = t1.reference_order_id 
),
tt(id, reference_order_id) as (
  select id,
         reference_order_id
  from   call_master
  where  reference_order_id = '1761' or id = '1761'   -- 1654 1760
  union all

  select t2.id,
         t2.reference_order_id
  from   call_master t2, tt
  where  t2.reference_order_id = tt.id
)
select * from  
(
  select distinct id from t1
  union
  select distinct id from tt
);

创建一次GTT会更常见:

create global temporary table temptbl (id number);

然后为您的会话插入相关记录:

insert into temptbl  
with t1(id, reference_order_id) as (
  select id,
         reference_order_id
  from   call_master
  where  reference_order_id = '1761' or id = '1761'   -- 1654 1760
  union all
  select t2.id,
         t2.reference_order_id
  from   call_master t2, t1
  where   t2.id = t1.reference_order_id 
),
tt(id, reference_order_id) as (
  select id,
         reference_order_id
  from   call_master
  where  reference_order_id = '1761' or id = '1761'   -- 1654 1760
  union all

  select t2.id,
         t2.reference_order_id
  from   call_master t2, tt
  where   t2.reference_order_id = tt.id
)
select * from  
(
  select distinct id  from   t1
  union
  select distinct id  from   tt
);

Global temporary tables是永久模式对象;只有他们持有的数据是临时的 - 对于将其插入表中的会话是私有的。在运行时创建GTT表明你可能做错了,要么需要创建一个GTT作为一次性并为每个使用它的会话填充它,或者可能应该使用完全不同的机制,如PL / SQL采集。

或者你可能来自另一个RDBMS,这种模式(使用GTT或私有临时表,在Oracle版本18c之前不存在),但是你做的事情实际上并不需要Oracle中的GTT或集合。

顺便说一句,union(没有all)删除了重复项,因此你正在加入的两个查询中的distinct子句是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.