Oracle SQL вставить в предложение with с помощью

#sql #oracle #with-statement

#sql #Oracle #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
  

Ответ №1:

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

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

Комментарии:

1. Можно ли сделать то же самое с временными таблицами? Например, вместо «создать таблицу t …», используя «создать таблицу # t …». У меня есть довольно сложный запрос, который мне нужно выполнить, часть которого должна оставаться за пределами только непосредственного запроса, вот почему мне нужна временная таблица, но я не хочу писать что-либо постоянное. Спасибо!

2. @MikeWilliamson поскольку #t (временная таблица), как вы описали, является временной таблицей SQL Server, это таблица oracle. Я могу подтвердить, что приведенное выше утверждение будет работать в глобальной временной таблице oracle, но это другой зверь, чем временная таблица SQL Server. Я могу только порекомендовать вам попробовать это, если приведенный выше синтаксис работает в SQL Server для обычной вставки таблицы, я бы ожидал, что он будет работать так же (примечание «ожидать» не означает, что это будет, и я не пробовал!)

3. В SQL Server 2008R2 вы не можете использовать этот синтаксис с таблицами mem (ie declare @t table (a int, b int, c int) )

Ответ №2:

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

Комментарии:

1. Я думаю, что мой пример был слишком фиктивным. У меня есть много значений, и я хотел бы использовать другую вспомогательную таблицу для каждого значения. Есть ли какой-либо souliton для этого? Спасибо и извините!

2. @user: пожалуйста, опубликуйте некоторые примеры данных и ожидаемый результат.

Ответ №3:

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

 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
  

Ответ №4:

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

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