插入…值(SELECT… FROM…)
我试图使用另一个表的输入来ѭ0表。虽然这对于许多数据库引擎来说完全可行,但我似乎总是很难记住当时
SQL
引擎(MySQL,Oracle,SQL Server,Informix和DB2)的正确语法。
是否有来自SQL标准(例如,SQL-92)的银弹语法允许我插入值而不必担心底层数据库?
没有找到相关结果
已邀请:
22 个回复
部窖空
这是标准ANSI SQL,应该适用于任何DBMS 它肯定适用于: 神谕 MS SQL Server MySQL的 Postgres的 SQLite v3 Teradata数据 DB2 SYBASE Vertica的 HSQLDB H2 AWS RedShift SAP HANA
闪脖
编辑:我应该提一下,我只使用Access,SQL 2000/2005 / Express,MySQL和PostgreSQL这种语法,所以应该涵盖这些。一位评论者指出它可以与SQLite3一起使用。
郡豪靠暖
中的一个值,我在SQLite3中执行了以下操作:
坍锭嘉韭蓝
适用于Informix,我希望,所有的DBMS。 (5年或更久以前,这是MySQL并不总是支持的东西;它现在对这种标准的SQL语法有很好的支持,而AFAIK,它在这种表示法上可以正常工作。)列列表是可选的但是按顺序指示目标列,因此SELECT结果的第一列将进入第一个列出的列,等等。如果没有列列表,SELECT结果的第一列将进入目标表的第一列。 系统之间可能存在的不同之处是用于识别不同数据库中的表的符号 - 该标准对数据库间(更不用说DBMS间)操作没什么好说的。使用Informix,您可以使用以下表示法来标识表:
也就是说,您可以指定一个数据库,可选择标识托管该数据库的服务器(如果它不在当前服务器中),后跟可选的所有者,点,最后是实际的表名。 SQL标准使用术语schema来表示Informix调用所有者的内容。因此,在Informix中,以下任何符号都可以标识表:
一般所有者不需要引用;但是,如果您使用引号,则需要正确拼写所有者名称 - 它会区分大小写。那是:
所有人都识别同一张桌子。使用Informix,MODE ANSI数据库有一个轻微的复杂性,其中所有者名称通常转换为大写(informix是例外)。也就是说,在MODE ANSI数据库(不常用)中,您可以编写:
并且系统目录中的所有者名称将是“SOMEONE”,而不是“某人”。如果将所有者名称括在双引号中,则它就像一个分隔标识符。使用标准SQL,可以在许多地方使用分隔标识符。使用Informix,您只能在所有者名称周围使用它们 - 在其他上下文中,Informix将单引号和双引号字符串视为字符串,而不是将单引号字符串分隔为字符串,将双引号字符串分隔为分隔标识符。 (当然,只是为了完整性,有一个环境变量,DELIMIDENT,可以设置 - 任何值,但Y是最安全的 - 表示双引号始终围绕分隔标识符,单引号始终包围字符串。) 请注意,MS SQL Server设法使用括在方括号中的[分隔标识符]。它看起来很怪异,当然不是SQL标准的一部分。
翱抹村
我使用的每个数据库都遵循这种语法,即
,
,
,
贡炮逗握惫
蹄寄噬非芹
部分中的所有列提供值,则可以在不指定
部分中的列的情况下完成此操作。 假设table1有两列。此查询应该有效:
这不起作用(未指定
的值):
我正在使用MS SQL Server。我不知道其他RDMS是如何工作的。
皇小福另届
苦诫
简单插入提示栏:
当表(#table2)的所选列数等于插入表(表1)时批量插入
想要仅插入表格的所需列(table1)时批量插入:
哩翔购
查询的
部分,只需使用
查询,如下所示。
bab
(我意识到学生姓名上的匹配可能会返回多个值但你明白了。当Id是一个Identity列并且未知时,匹配除Id之外的其他内容。)
渴翅吮斡撤
递劝臼类洪
这适用于所有DBMS
孤捷侩
这句话与甲骨文有点不同。
公藕
这适用于那里可用的任何其他RDBMS。记住所有产品IMO的所有语法都没有意义。
孝铜差
表插入所有列,可以尝试此操作。
屑凉赦
它消除了添加Insert()集的步骤,您只需选择表中的值。
嗓瑰
看起来不错,但只有在tmp不存在(创建并填充)时才有效。 (SQL服务器) 要插入到现有的tmp表中:
佩疵瓦
荒劫娇噬
穗揣
否则MySQL对象“列数与行1处的值计数不匹配”,并且当您最终弄清楚如何处理它时,您最终会写一个简单的帖子。
良阑纠苫