插入到值(选择从……)

watbbzwu  于 2021-07-24  发布在  Java
关注(0)|答案(26)|浏览(281)

我正在努力 INSERT INTO 使用另一个表的输入的表。尽管这对于许多数据库引擎是完全可行的,但我似乎总是很难记住 SQL 今天的引擎(mysql、oracle、sqlserver、informix和db2)。
是否有一个来自sql标准(例如sql-92)的银弹语法允许我插入值而不必担心底层数据库?

iyfjxgzm

iyfjxgzm1#

尝试:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

这是标准的ansisql,应该适用于任何dbms
它绝对适用于:
Oracle
ms sql服务器
mysql数据库
博士后
sqlite v3版
天睿资讯
db2公司
赛贝斯
眩晕
hsqldb公司
氢气
aws红移
sap hana公司
谷歌扳手

qpgpyjmq

qpgpyjmq2#

claude houle的回答是:应该可以很好地工作,而且还可以有多个列和其他数据:

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

我只在access、sql2000/2005/express、mysql和postgresql中使用过这种语法,所以应该涵盖这些语法。它还应该与sqlite3一起工作。

j0pj023g

j0pj023g3#

在多重值中只得到一个值 INSERT 在另一个表中,我在sqlite3中执行了以下操作:

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))
p5fdfcr1

p5fdfcr14#

我看到的这两个答案在informix中都能很好地工作,基本上都是标准sql。即符号:

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

可以很好地与informix和所有dbms配合使用(在5年或更长的时间以前,mysql并不总是支持这种东西;它现在对这种标准的sql语法有了很好的支持,而且,对这种表示法来说,它还可以工作。)列列表是可选的,但它按顺序指示目标列,因此select结果的第一列将进入第一列,以此类推,在没有列列表的情况下,select结果的第一列进入目标表的第一列。
不同系统之间的区别在于用于标识不同数据库中的表的符号-该标准对数据库间(更不用说数据库间)操作没有任何规定。对于informix,您可以使用以下符号来标识表:

[dbase[@server]:][owner.]table

也就是说,您可以指定一个数据库,如果该数据库不在当前服务器中,可以选择标识承载该数据库的服务器,后跟可选的所有者dot,最后是实际的表名。sql标准使用术语schema来表示informix所称的所有者。因此,在informix中,以下任何符号都可以标识一个表:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

业主一般不需要报价;但是,如果使用引号,则需要正确拼写所有者名称-它将区分大小写。即:

someone.table
"someone".table
SOMEONE.table

它们都标识同一个表。对于informix,模式ansi数据库有一点复杂,所有者名称通常转换为大写(informix是例外)。也就是说,在模式ansi数据库(不常用)中,您可以编写:

CREATE TABLE someone.table ( ... )

系统目录中的所有者名称应该是“someone”,而不是“someone”。如果将所有者名称括在双引号中,则其作用类似于分隔标识符。对于标准sql,分隔标识符可以在许多地方使用。使用informix,您只能在所有者名称周围使用它们——在其他上下文中,informix将单引号和双引号字符串都视为字符串,而不是将单引号字符串分隔为字符串,将双引号字符串分隔为分隔标识符(当然,为了完整起见,有一个环境变量delimident,可以设置为任何值,但y是最安全的,它表示双引号总是环绕分隔标识符,单引号总是环绕字符串。)
请注意,mssqlserver设法使用方括号中的[分隔标识符]。在我看来这很奇怪,而且肯定不是sql标准的一部分。

cfh9epnr

cfh9epnr5#

要在第一个答案中添加一些内容,当我们只需要另一个表中的几条记录(在本例中只有一条)时:

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);
4ioopgfo

4ioopgfo6#

insert-into和select子查询的两种方法。
使用select子查询返回一行结果。
使用select子查询返回多行结果。
1.使用select子查询返回一行结果的方法。

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

在这种情况下,它假设select子查询只返回一行基于where条件或sql聚合函数(如sum、max、avg等)的结果,否则它将抛出错误
2.返回多行结果的with select子查询的方法。

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

第二种方法适用于这两种情况。

bnlyeluc

bnlyeluc7#

而不是 VALUES 部分 INSERT 查询,只需使用 SELECT 查询如下。

INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2
tgabmvqs

tgabmvqs8#

大多数数据库都遵循基本语法,

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

我使用的每个数据库都遵循这个语法, DB2 , SQL Server , MY SQL , PostgresQL

ltskdhd1

ltskdhd19#

这可以在不指定 INSERT INTO 如果要为 SELECT 部分。
假设table1有两列。此查询应适用于:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

这不起作用(对于 col2 (未指定):

INSERT INTO table1
SELECT  col1
FROM    table2

我正在使用ms sql server。我不知道其他RDM是怎么工作的。

rbl8hiat

rbl8hiat10#

这是将值与select一起使用的另一个示例:

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...
cygmwpex

cygmwpex11#

表列顺序已知时的简单插入:

Insert into Table1
    values(1,2,...)

简单插入列:

Insert into Table1(col2,col4)
    values(1,2)

当表(#table2)的选定列数等于插入表(table1)时进行批量插入

Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

批量插入当您只想插入到表(表1)的所需列中时:

Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2
w8rqjzmb

w8rqjzmb12#

在insert中使用select子句的括号即可。例如:

INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
   'col1_value', 
   'col2_value',
   (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
   'col3_value'
);
wbgh16ku

wbgh16ku13#

下面是另一个使用多个表获取源的示例:

INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;
pcww981p

pcww981p14#

下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个Map表:

insert into StudentCourseMap (StudentId, CourseId) 
SELECT  Student.Id, Course.Id FROM Student, Course 
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'

(我意识到匹配学生姓名可能会返回多个值,但你明白了。当id是标识列且未知时,有必要对id以外的内容进行匹配。)

0yycz8jy

0yycz8jy15#

INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

这适用于所有dbms

相关问题