Вставка Oracle SQL в предложение With

Я новичок в 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

person user2424380    schedule 04.05.2011    source источник


Ответы (4)


Вы можете использовать столько '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
/

Имея это в виду, вы можете выполнять все свои соединения с помощью обычного соединения таблиц с главной таблицей.

person Harrison    schedule 04.05.2011
comment
Можно ли сделать то же самое с временными таблицами? Например, вместо создания таблицы t... используйте команду create table #t.... У меня есть довольно сложный запрос, который мне нужно сделать, часть которого должна остаться за пределами непосредственного запроса, поэтому мне нужен временный стол, но я не хочу писать ничего постоянного. Спасибо! - person Mike Williamson; 12.01.2012
comment
@MikeWilliamson, поскольку #t (временная таблица), как вы описали, является временной таблицей SQL Server, это таблица оракула. Я могу засвидетельствовать, что приведенный выше оператор будет работать в глобальной временной таблице оракула, но это другой зверь, чем временная таблица SQL Server. Я могу только порекомендовать вам попробовать это, если приведенный выше синтаксис работает в SQL Server для обычной вставки таблицы, я ожидаю, что он будет работать так же (обратите внимание, что ожидание не означает, что это будет, и я не пробовал!) - person Harrison; 14.01.2012
comment
В SQL Server 2008R2 вы не можете использовать этот синтаксис с таблицами памяти (т.е. declare @t table (a int, b int, c int) ) - person ohmusama; 14.08.2014

Вы можете сделать что-то вроде

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
person Justin Cave    schedule 04.05.2011

Имейте в виду, что использование CTE предназначено для небольшого объема данных. Наличие тысяч строк в CTE может привести к снижению производительности.

Это связано с тем, что все содержимое вспомогательной таблицы хранится в PGA, если не в TEMP.

person user3807115    schedule 29.12.2018

person    schedule
comment
Я думаю, что мой пример был слишком фиктивным. У меня много значений, и я хотел бы использовать разные вспомогательные таблицы для каждого значения. Есть ли соулитон для этого? Спасибо и извините! - person user2424380; 04.05.2011
comment
@user: опубликуйте пример данных и ожидаемый результат. - person Quassnoi; 04.05.2011