Как повторно использовать часть кода SQL в Oracle - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть 4 таблицы в моей базе данных: t1, t2, t3, t4

И я хотел бы запустить 4 оператора вставки:

insert into t1
with a as (select from another_table1 where condition1)
**XXX**;

insert into t2
with a as (select from another_table2 where condition2)
**XXX**;

insert into t3
with a as (select from another_table3 where condition3)
**XXX**;

insert into t4
with a as (select from another_table4 where condition4)
**XXX**;

, где XXX - большой кусок SQL код (с несколькими объединениями выбора из a), но этот код одинаков во всех 4 операторах вставки

Есть ли способ повторно использовать XXX в операторах вставки и не записывать его 4 раза? (если мне нужно что-то изменить, я не хочу менять это в 4 разных местах моего SQL кода)

[EDIT # 1]

Текст XXX - это вид:

select col1, sum(col10) from a group by col1 union all
select col2, sum(col11) from a group by col2 union all
select col3, sum(col12) from a group by col3 union all
...

a в каждом операторе вставки отличается из-за различного оператора with, но текст XXX одинаков *

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Если между таблицами, в которые вы вставляете таблицы, нет внешних ключей, это можно сделать одним оператором insert all. (Оператор insert all может завершиться ошибкой из-за нарушения ограничений внешнего ключа, поскольку он не гарантирует порядок таблиц, в которые он будет вставлен.)

Во-первых, вы можете записать свои операторы select в один запрос, например:

WITH t1 AS (SELECT 'a' col1, 'b' col2, 'c' col3, 10 col10, 11 col11, 12 col12 FROM dual UNION ALL
            SELECT 'aa' col1, 'bb' col2, 'cc' col3, 20 col10, 21 col11, 22 col12 FROM dual UNION ALL
            SELECT 'aaa' col1, 'b' col2, 'cc' col3, 30 col10, 31 col11, 42 col12 FROM dual),
     t2 AS (SELECT 'a' col1, 'b' col2, 'c' col3, 100 col10, 111 col11, 122 col12 FROM dual UNION ALL
            SELECT 'a' col1, 'bb' col2, 'cc' col3, 200 col10, 211 col11, 222 col12 FROM dual UNION ALL
            SELECT 'a' col1, 'b' col2, 'cc' col3, 300 col10, 311 col11, 422 col12 FROM dual),
      a AS (SELECT 't1' table_name, col1, col2, col3, col10, col11, col12 FROM t1
            UNION ALL
            SELECT 't2' table_name, col1, col2, col3, col10, col11, col12 FROM t2),
  dummy AS (SELECT LEVEL id
            FROM   dual
            CONNECT BY LEVEL <= 3)
SELECT table_name,
       CASE WHEN d.id = 1 THEN 'col1'
            WHEN d.id = 2 THEN 'col2'
            WHEN d.id = 3 THEN 'col3'
       END main_col,
       CASE WHEN d.id = 1 THEN col1
            WHEN d.id = 2 THEN col2
            WHEN d.id = 3 THEN col3
       END main_col_vals,
       SUM(CASE WHEN d.id = 1 THEN col10
                WHEN d.id = 2 THEN col11
                WHEN d.id = 3 THEN col12
           END) sum_vals
FROM   a
       CROSS JOIN dummy d
GROUP BY table_name,
         CASE WHEN d.id = 1 THEN 'col1'
              WHEN d.id = 2 THEN 'col2'
              WHEN d.id = 3 THEN 'col3'
         END,
         CASE WHEN d.id = 1 THEN col1
              WHEN d.id = 2 THEN col2
              WHEN d.id = 3 THEN col3
         END
ORDER BY table_name,
         main_col,
         main_col_vals;

При этом используется метод поворота старого стиля для поворота всех значений из всех таблиц в один go, помечая строки соответствующим именем таблицы.

Тогда это просто вопрос добавления этого в оператор вставки всех, например:

insert all
  when table_name = 't1' then into
    another_t1 (cola, val) values (main_col_vals, sum_vals)
  when table_name = 't2' then into
    another_t2 (cola, val) values (main_col_vals, sum_vals)
WITH a AS (SELECT 't1' table_name, col1, col2, col3, col10, col11, col12 FROM t1
           UNION ALL
           SELECT 't2' table_name, col1, col2, col3, col10, col11, col12 FROM t2),
 dummy AS (SELECT LEVEL id
           FROM   dual
           CONNECT BY LEVEL <= 3)
SELECT table_name,
       CASE WHEN d.id = 1 THEN 'col1'
            WHEN d.id = 2 THEN 'col2'
            WHEN d.id = 3 THEN 'col3'
       END main_col,
       CASE WHEN d.id = 1 THEN col1
            WHEN d.id = 2 THEN col2
            WHEN d.id = 3 THEN col3
       END main_col_vals,
       SUM(CASE WHEN d.id = 1 THEN col10
                WHEN d.id = 2 THEN col11
                WHEN d.id = 3 THEN col12
           END) sum_vals
FROM   a
       CROSS JOIN dummy d
GROUP BY table_name,
         CASE WHEN d.id = 1 THEN 'col1'
              WHEN d.id = 2 THEN 'col2'
              WHEN d.id = 3 THEN 'col3'
         END,
         CASE WHEN d.id = 1 THEN col1
              WHEN d.id = 2 THEN col2
              WHEN d.id = 3 THEN col3
         END;

Вот контрольный пример .

0 голосов
/ 04 февраля 2020

если ваше рассмотрение не выполняет его 4 раза, тогда вы можете создать временную таблицу для него. используйте его, а затем отбросьте.

create global temporary table temp_table_transaction on commit preserve rows
as 
<your query goes here>

, но в противном случае (если вы хотите использовать его повторно, вы можете создавать представления). Views выполняет SQL вовремя.

0 голосов
/ 04 февраля 2020

Используя представление?

create or replace view xxx as
  select whatever 
  from blabla;

insert into t1
with a as (select ... from another_table1 where condition1)
select * from a
join xxx on ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...