Вставить ВСЕ из другой таблицы

Я пытаюсь выполнить приведенный ниже оператор одним выстрелом. Как мы делаем это, используя INSERT ALL для вставки строк за одно выполнение. Есть ли способ, которым мы можем выполнить два приведенных ниже оператора за одно выполнение (используя INSERT ALL).

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT 1234, -- unique id for this insertion
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1;
INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT 1235, -- unique id for this insertion
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=2;

person Hareesh    schedule 22.02.2018    source источник
comment
Какое это имеет отношение к INSERT ALL? (Подсказка: НИЧЕГО!) Вы можете легко сделать это в одном операторе INSERT: оставьте только первый оператор, но измените предложение WHERE на WHERE COLUMN_9 IN (1, 2).   -  person mathguy    schedule 22.02.2018
comment
Мой плохой, мой пример неправильный. Я обновил вопрос.   -  person Hareesh    schedule 22.02.2018


Ответы (3)


Конечно, для сбора оба идентификатора 1 и 2

и используйте decode, чтобы различать 1234 и 1235:

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT decode(COLUMN_9,1,1234,2,1235),
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 in (1,2);
person user7294900    schedule 22.02.2018
comment
вам не хватает другого значения для столбца_1 в зависимости от разных значений столбца_9 - person Chrᴉz supports Monica; 22.02.2018

Вы можете использовать INSERT INTO ... SELECT с запросом на объединение:

INSERT INTO TABLE_a (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6,
    COLUMN_7, COLUMN_8)
SELECT
    1234, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6, COLUMN_7, COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 = 1
UNION ALL
SELECT
    1235, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6, COLUMN_7, COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 = 2

Этот подход имеет одно заметное преимущество перед вашим первоначальным подходом. С этим ответом вся вставка происходит в одном выражении.

person Tim Biegeleisen    schedule 22.02.2018
comment
Мой плохой, мой пример неправильный. Я обновил вопрос. - person Hareesh; 22.02.2018
comment
Если есть около 5 операторов выбора, это все еще хорошо, имея объединение между операторами выбора? - person Hareesh; 22.02.2018
comment
Да, вы можете объединить столько, сколько вам нужно. Oracle может наложить ограничение, но, скорее всего, этого не произойдет при 5, если предположить, что каждый из этих 5 выборок не является массовым или занимает очень много времени. - person Tim Biegeleisen; 22.02.2018
comment
Это решение также имеет заметное недостатокпреимущество по сравнению с решением DECODE или, возможно, CASE, заключающееся в том, что оно считывает TABLE_B дважды (или пять раз, если OP необходимо сделать это для пяти разных значений в COLUMN_9). ). - person mathguy; 22.02.2018

Почему бы не использовать условие ИЛИ? Попробуйте это, если это работает для вас

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT CASE WHEN COLUMN_9 = 1 THEN 1234 WHEN COLUMN_9 = 2 THEN 1235 END,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1 OR COLUMN_9=2;

Использование DECODE() функция, предложенная @Chris

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT DECODE(COLUMN_9,1,1234,2,1235)
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1 OR COLUMN_9=2;
person Mudassir Hasan    schedule 22.02.2018
comment
Мой плохой, мой пример неправильный. Я обновил вопрос. - person Hareesh; 22.02.2018
comment
@Hareesh.check отредактированный ответ .. вы можете использовать оператор CASE WHEN для вставки желаемых значений в TABLE_A column_1 в соответствии со значением в Column_9 TABLE_B, т.е. для 1 или 2, тогда 1234 и 1235 соответственно вставляются. - person Mudassir Hasan; 22.02.2018
comment
Также требуется только один оператор SELECT, вставка уникального идентификатора обрабатывается оператором CASE. - person Mudassir Hasan; 22.02.2018
comment
вы также можете использовать функцию DECODE в оракуле: DECODE(column_name, value1, ret_value1, value2, retvalue2, defaultvalue) . DECODE может обрабатывать до 255 (?) значений. Работает с целыми числами, символами и всем остальным - person Chrᴉz supports Monica; 22.02.2018
comment
@Chriz, спасибо, что поделились .. Я увлекаюсь SQL Server .. не знал о функции DECODE () .. приятно узнавать что-то новое время от времени. - person Mudassir Hasan; 22.02.2018