Sql 使用修改的值和通配符选择Into语句
是否可以为同一个表创建一个INSERT SELECT语句,其中包含修改后的值和其余列的通配符 我成功地获得了一个带有修改值的select insert语句。但不能附加通配符。我希望避免命名每一列 V_uu是变量:) 那是我想要的方式。Sql 使用修改的值和通配符选择Into语句,sql,select,db2,Sql,Select,Db2,是否可以为同一个表创建一个INSERT SELECT语句,其中包含修改后的值和其余列的通配符 我成功地获得了一个带有修改值的select insert语句。但不能附加通配符。我希望避免命名每一列 V_uu是变量:) 那是我想要的方式。 INSERT INTO Table_1 ( T1.ID, T1.NAME, T1.SITE, T1.*) SELECT T1.V_DE_SITE, T1.V_NAM
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;
我更改了新数据集的id和名称,并*将其余列1:1复制到新id…这就是我所需要的。我不会在语句中写下所有列。在这种情况下,您不能使用通配符。但您可以生成这样一个语句的模板:
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
中的所有表列。如果您愿意,可以省略此类规范。在初始的wanting insert语句中,它有“where 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*fromt1
如下所示,它是表t1中的当前数据
C1 C2 C3 C4 C5
----------- ---------- ---------- ---------- ----------
1 aaa AAA aaaa AAAA
2 bbb BBB bbbb BBBB
3 ccc CCC cccc CCCC
第二个在update语句之后显示如下:
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的其余列
如果我误解了你的要求,请不要理会
希望这有帮助。这不起作用。很遗憾,我收到错误消息:SQL错误[42601]:在“选择当前C”之后发现意外的标记“”。预期的标记可能包括:“,”SQLCODE=-104,SQLSTATE=42601,Driver 4.26.14我提供的语句可以在任何Db2 for LUW版本上按原样工作。您的Db2版本和平台是什么?在我的示例中没有选择当前的C字符序列。您是按原样运行语句吗?还是运行您自己的语句?我用我的语句对其进行了测试。我只取了这个:INSERT-inTEST_COLUMNS从SYSCAT.COLUMNS C;中选择当前时间戳TS,C.*,并修改为我自己的时间戳,但它不起作用。为什么在您的示例中创建表语句?我有db2 for LUW,我的平台是eclipse,版本是db2 v11.1.1.1