我看到的這兩個(gè)答案在Informix中都很好,而且基本上都是標(biāo)準(zhǔn)SQL。也就是說,表示法:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
使用Informix和所有DBMS都很好。(5年前或更多年前,MySQL并不總是支持這類東西;它現(xiàn)在對這種標(biāo)準(zhǔn)SQL語法有很好的支持,AFAIK在這種表示法上可以正常工作。)列列表是可選的,但按順序指示目標(biāo)列,因此SELECT結(jié)果的第一列將進(jìn)入第一列,以此類推。如果沒有列表,則選擇結(jié)果的第一列進(jìn)入目標(biāo)表的第一列。
系統(tǒng)之間的不同之處在于用于標(biāo)識不同數(shù)據(jù)庫中的表示法-對于數(shù)據(jù)庫間操作(更不用說數(shù)據(jù)庫間數(shù)據(jù)庫管理系統(tǒng)),該標(biāo)準(zhǔn)沒有什么可說的。使用Informix,您可以使用以下符號來標(biāo)識表:
[dbase[@server]:][owner.]table
也就是說,您可以指定一個(gè)數(shù)據(jù)庫,如果數(shù)據(jù)庫不在當(dāng)前服務(wù)器中,則可以選擇標(biāo)識承載該數(shù)據(jù)庫的服務(wù)器,然后是可選的所有者點(diǎn),最后是實(shí)際的表名。SQL標(biāo)準(zhǔn)使用術(shù)語模式來表示Informix所稱的所有者。因此,在Informix中,下列任何一個(gè)符號都可以識別一個(gè)表:
table"owner".tabledbase:tabledbase:owner.tabledbase@server:tabledbase@server:owner.table
所有者一般不需要被引用;但是,如果您確實(shí)使用了引號,則需要將所有者名拼寫正確-它會區(qū)分大小寫。即:
someone.table"someone".tableSOMEONE.table
都能識別出同一張表。使用Informix,模式ANSI數(shù)據(jù)庫有一個(gè)輕微的復(fù)雜性,其中所有者名稱通常轉(zhuǎn)換為大寫(Informix是例外)。也就是說,在模式ANSI數(shù)據(jù)庫(不常用)中,您可以編寫:
CREATE TABLE someone.table ( ... )
系統(tǒng)目錄中的所有者名稱將是“某人”,而不是“某人”。如果將所有者名稱括在雙引號中,則它的作用類似于分隔標(biāo)識符。使用標(biāo)準(zhǔn)SQL,可以在許多地方使用分隔標(biāo)識符。使用Informix,您可以只在所有者名稱周圍使用它們-在其他上下文中,Informix將單引號和雙引號字符串視為字符串,而不是將單引號字符串和雙引號字符串分隔為分隔標(biāo)識符。(當(dāng)然,為了完整起見,有一個(gè)環(huán)境變量DELIMIDENT,它可以被設(shè)置為任何值,但Y是最安全的,它表明雙引號總是環(huán)繞分隔標(biāo)識符,單引號總是圍繞字符串。)
請注意,MSSQLServer設(shè)法使用方括號中的[分隔標(biāo)識符]。在我看來,這看起來很奇怪,而且肯定不是SQL標(biāo)準(zhǔn)的一部分。