30

我是 sql 新手,所以也许这是一个愚蠢的问题,但是有没有可能将 With 子句与 Insert Into 一起使用?或者有什么常见的解决方法?我的意思是这样的:

With helper_table As (
Select * From dummy2
)
Insert Into dummy1 Values (Select t.a From helper_table t Where t.a = 'X' );

谢谢!

我的例子太假了,所以我添加了一些扩展代码(到目前为止的答案)。

INSERT
INTO    dummy values (a,b)  //more values
WITH    helper_table AS
    (
    SELECT  *
    FROM    dummy2
    )
WITH    helper_table2 AS   //from more tables
    (
    SELECT  *
    FROM    dummy3
    )         
SELECT  t.value as a, t2.value as b
FROM    helper_table t 
join helper_table t2 on t.value = t2.value //some join
WHERE   t.value = 'X' and t2.value = 'X'   //other stuff
4

4 回答 4

41

您可以使用任意数量的“helper_tables”。

create table t(helper1 varchar2(50) , helper2 varchar2(50) , dataElement varchar2(50) );


insert into t(helper1, helper2, dataelement)
with
     de as(select level lvl from dual connect by level <10)
     ,h1 as (select lvl, lvl/1.5 hp from de)
     ,h2 as (select lvl,  lvl/2 hp2 from de)
select h1.hp , h2.hp2, de.lvl
  from de 
        inner join
       h1 on de.lvl = h1.lvl
        inner join
       h2 on de.lvl = h2.lvl
/

考虑到这一点,您可以通过将表正常连接到主表来完成所有连接

于 2011-05-04T15:25:06.720 回答
10
INSERT
INTO    dummy1
WITH    helper_table AS
        (
        SELECT  *
        FROM    dummy2
        )
SELECT  t.a
FROM    helper_table t
WHERE   t.a = 'X'
于 2011-05-04T14:46:01.373 回答
8

你可以做类似的事情

INSERT INTO dummy1
  WITH helper_table AS (
    SELECT *
      FROM dummy2
    )
  SELECT t.a
    FROM helper_table t
   WHERE t.a = 'X';

对于您更新的查询

INSERT
INTO    dummy values (a,b)  //more values
WITH    helper_table AS
    (
    SELECT  *
    FROM    dummy2
    ),
        helper_table2 AS   //from more tables
    (
    SELECT  *
    FROM    dummy3
    )         
SELECT  t.value as a, t2.value as b
FROM    helper_table t 
join helper_table t2 on t.value = t2.value //some join
WHERE   t.value = 'X' and t2.value = 'X'   //other stuff
于 2011-05-04T14:46:21.930 回答
-1

请记住,使用 CTE 的目的是处理少量数据。CTE 中有数千行可能会导致性能下降。

这是因为如果不在 TEMP 中,所有帮助表内容都存储在 PGA 中

于 2018-12-29T14:47:59.973 回答