Выберите Into Statement с измененным значением и подстановочным знаком - PullRequest
2 голосов
/ 28 октября 2019

Можно ли сделать оператор INSERT SELECT для той же таблицы с измененными значениями и подстановочный знак для остальных столбцов?

Мне удалось получить оператор select insert с измененными значениями. но не дополнительно с подстановочным знаком. Я хотел бы избежать необходимости называть каждый столбец.

V_ - переменные:)

так, как я хочу.

INSERT INTO Table_1 (
        T1.ID,
        T1.NAME,
        T1.SITE,
        T1.*) 
SELECT          T1.V_DE_SITE,
        T1.V_NAME,
        T1.V_SITE,
        T1.*
FROM Table_1 AS T1 WHERE T1.ID = V_SO_SITE;

возможно следующее, но без подстановочных знаков! :( в таблице есть еще несколько столбцов

INSERT INTO Table_1 (
        ID,
        NAME,
        SITE) 
SELECT          V_DE_SITE,
        V_NAME,
        V_SITE
FROM Table_1 WHERE ID = V_SO_SITE;

Редактировать больше информации:

Можно ли написать:

Insert into tablexyz  (id, name, * ) select 3, 'hello', * from tablexyz where id = 100; 

я меняю идентификатор и имядля нового набора данных и * скопируйте остаток столбцов 1: 1 в новый идентификатор .... это все, что мне нужно. Я не буду записывать все столбцы в операторе.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы не можете использовать подстановочный знак в этом случае. Но вы можете сгенерировать шаблон такого оператора, как это:

SELECT 
  'INSERT INTO "'||TABSCHEMA||'"."'||TABNAME||'"'
--||' ('||LISTAGG('"'||COLNAME||'"', ', ') WITHIN GROUP (ORDER BY COLNO) ||')'
||x'0a'||'SELECT ' ||LISTAGG('"'||COLNAME||'"', x'0a'||', ') WITHIN GROUP (ORDER BY COLNO)
||x'0a'||'FROM "'||TABSCHEMA||'"."'||TABNAME||'";' STMT
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA='DB2ADMIN' AND TABNAME='EMPLOYEE'
GROUP BY TABSCHEMA, TABNAME;

Результат:

STMT
----
INSERT INTO "DB2ADMIN"."EMPLOYEE"
SELECT "EMPNO"
, "FIRSTNME"
, "MIDINIT"
, "LASTNAME"
, "WORKDEPT"
, "PHONENO"
, "HIREDATE"
, "JOB"
, "EDLEVEL"
, "SEX"
, "BIRTHDATE"
, "SALARY"
, "BONUS"
, "COMM"
FROM "DB2ADMIN"."EMPLOYEE";

Теперь вы можете указать выражения для необходимых столбцов в списке select соответственно.
Если вы раскомментируете закомментированную строку, все столбцы таблицы в insert указываются. Вы можете опустить такую ​​спецификацию, если хотите.

0 голосов
/ 02 ноября 2019

При первоначальном желании вставить оператор, он имеет "где id = 100". Для меня это означает, что вы хотите изменить одну конкретную строку. Если это так, то вместо этого можно использовать оператор update . Вот пример.

#!/bin/sh

db2 -v "drop database db1"
db2 -v "create database db1"
db2 -v "connect to db1"
db2 -v "create table t1 (c1 int, c2 char(10), c3 char(10), c4 char(10), c5 char(10))"
db2 -v "insert into t1 values ( 1, 'aaa', 'AAA', 'aaaa', 'AAAA')"
db2 -v "insert into t1 values ( 2, 'bbb', 'BBB', 'bbbb', 'BBBB')"
db2 -v "insert into t1 values ( 3, 'ccc', 'CCC', 'cccc', 'CCCC')"
db2 -v "select * from t1"
db2 -v "update t1 set c1=4, c2='ddd' where c1=3"
db2 -v "select * from t1"
db2 -v "terminate"

Первый select * from t1 показывает ниже, какие текущие данные в таблице t1.

C1          C2         C3         C4         C5
----------- ---------- ---------- ---------- ----------
          1 aaa        AAA        aaaa       AAAA
          2 bbb        BBB        bbbb       BBBB
          3 ccc        CCC        cccc       CCCC

И второй показывает ниже после обновления оператор:

C1          C2         C3         C4         C5
----------- ---------- ---------- ---------- ----------
          1 aaa        AAA        aaaa       AAAA
          2 bbb        BBB        bbbb       BBBB
          4 ddd        CCC        cccc       CCCC

Как и выше, мы можем изменить C1 = 4 и C2 = 'ddd' , но оставить остальные столбцы для строки C1 = 3 был.

Пожалуйста, не обращайте внимания, если я неправильно пойму ваше требование.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...