#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, если не во временном