我看到的两个答案都特别适用于 Informix,并且基本上都是标准 SQL。也就是记号:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
与 Informix 以及我希望的所有 DBMS 都可以正常工作。 (从前 5 年或更多年前,这是 MySQL 并不总是支持的那种东西;它现在对这种标准 SQL 语法有很好的支持,而且,AFAIK,它可以在这种表示法上正常工作。)列列表是可选的,但按顺序指示目标列,因此 SELECT 的结果的第一列将进入第一个列出的列,依此类推。在没有列列表的情况下,SELECT 的结果的第一列进入目标表的第一列。
系统之间的不同之处在于用于识别不同数据库中的表的符号 - 该标准对数据库间(更不用说 DBMS 间)操作没有任何规定。使用 Informix,您可以使用以下表示法来标识表:
[dbase[@server]:][owner.]table
也就是说,您可以指定一个数据库,如果该数据库不在当前服务器中,则可以选择标识托管该数据库的服务器,然后是可选的所有者、点,最后是实际的表名。 SQL 标准使用术语模式来表示 Informix 所称的所有者。因此,在 Informix 中,以下任何符号都可以标识一个表:
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
业主一般不需要报价;但是,如果您确实使用引号,则需要正确拼写所有者名称 - 它区分大小写。那就是:
someone.table
"someone".table
SOMEONE.table
所有标识同一个表。对于 Informix,MODE ANSI 数据库有一点复杂性,其中所有者名称通常转换为大写(informix 是个例外)。也就是说,在一个 MODE ANSI 数据库中(不常用),你可以这样写:
CREATE TABLE someone.table ( ... )
系统目录中的所有者名称将是“SOMEONE”,而不是“某人”。如果将所有者名称括在双引号中,则它的作用类似于分隔标识符。使用标准 SQL,分隔标识符可以在很多地方使用。使用 Informix,您只能在所有者名称周围使用它们 —— 在其他上下文中,Informix 将单引号和双引号字符串都视为字符串,而不是将单引号字符串和双引号字符串分隔为分隔标识符。 (当然,为了完整起见,有一个环境变量 DELIMIDENT 可以设置 - 为任何值,但 Y 是最安全的 - 表示双引号始终围绕分隔标识符,单引号始终围绕字符串。)
请注意,MS SQL Server 设法使用括在方括号中的 [delimited identifiers]。我觉得它很奇怪,而且肯定不是 SQL 标准的一部分。