Sql 使用修改的值和通配符选择Into语句

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 SELECT语句,其中包含修改后的值和其余列的通配符

我成功地获得了一个带有修改值的select insert语句。但不能附加通配符。我希望避免命名每一列

V_uu是变量:)

那是我想要的方式。

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