select用法 - sql select into用法




插入...值(SELECT... FROM...) (14)

我正在嘗試使用來自另一個表的輸入INSERT INTO到表中。 儘管對於許多數據庫引擎來說這是完全可行的,但我總是很難記住當天的SQL引擎( MySQLOracleSQL ServerInformixDB2 )的正確語法。

是否存在來自SQL standard (例如SQL-92 )的銀牌語法,它可以讓我插入值而不用擔心底層數據庫?


@ Shadow_x99 :應該可以正常工作,並且您還可以有多個列和其他數據:

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

編輯:我應該提到,我只在Access,SQL 2000/2005 / Express,MySQL和PostgreSQL中使用了這種語法,因此應該涵蓋這些語法。 一位評論者指出,它將與SQLite3一起工作。


以下是如何從多個表格中插入。 這個特殊的例子是你在許多情況下有一個映射表的地方:

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以外的內容是必要的。)


大多數數據庫都遵循基本語法,

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

我使用的每個數據庫都遵循這個語法,即DB2SQL ServerMY SQLPostgresQL


如果使用INSERT VALUES路徑插入多行,請確保使用圓括號將VALUES分隔到集合中,以便:

INSERT INTO `receiving_table`
  (id,
  first_name,
  last_name)
VALUES 
  (1002,'Charles','Babbage'),
  (1003,'George', 'Boole'),
  (1001,'Donald','Chamberlin'),
  (1004,'Alan','Turing'),
  (1005,'My','Widenius');

否則,MySQL對象的“列計數與第1行的值計數不匹配”,並且最終在最終找出如何處理它時寫了一個簡單的帖子。


如果要使用SELECT * INTO表插入所有列,則可以嘗試此操作。

SELECT  *
INTO    Table2
FROM    Table1;

它簡單,而不是INSERT查詢的VALUES部分,只需使用SELECT查詢如下。

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

我其實更喜歡SQL Server 2008中的以下內容:

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

它消除了添加Insert()集的步驟,並且您只需選擇表中的哪些值。


我看到的兩個答案在Informix中都很好地工作,基本上都是標準的SQL。 也就是說,符號:

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

對於Informix以及我所期望的所有DBMS都能正常工作。 (5年或更長時間之前,這就是MySQL並不總是支持的東西;它現在對這種標準SQL語法有很好的支持,而AFAIK在這種表示法下可以正常工作)。列列表是可選的,但是按順序指示目標列,所以SELECT的結果的第一列將進入列出的第一列等。在沒有列列表的情況下,SELECT的結果的第一列進入目標表的第一列。

系統之間有什麼不同可以用來識別不同數據庫中的表格 - 該標準對於數據庫間(更不用說數據庫間管理系統)操作沒有什麼可說的。 使用Informix,可以使用以下表示法來標識表:

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

也就是說,您可以指定一個數據庫,如果它不在當前服務器中,則可以選擇標識承載該數據庫的服務器,然後指定一個可選的所有者,點,最後是實際的表名稱。 SQL標準針對Informix所謂的所有者使用術語模式。 因此,在Informix中,以下所有符號都可以標識一個表格:

table
"owner".table
dbase:table
dbase:owner.table
[email protected]:table
[email protected]:owner.table

一般所有者不需要被引用; 但是,如果您確實使用了引號,則需要正確拼寫所有者名稱 - 它會區分大小寫。 那是:

someone.table
"someone".table
SOMEONE.table

全部識別相同的表格。 對於Informix,MODE ANSI數據庫存在一個輕微的複雜性,其中所有者名稱通常會轉換為大寫(informix是例外)。 也就是說,在一個MODE ANSI數據庫(不常用)中,你可以寫:

CREATE TABLE someone.table ( ... )

而係統目錄中的所有者名稱將是“某人”,而不是“某人”。 如果將所有者名稱用雙引號括起來,它就像分隔標識符一樣。 使用標準SQL,可以在許多地方使用分隔標識符。 對於Informix,只能在所有者名稱周圍使用它們 - 在其他上下文中,Informix將單引號和雙引號字符串視為字符串,而不是將單引號字符串分隔為字符串和雙引號字符串作為分隔標識符。 (當然,為了完整起見,還有一個環境變量DELIMIDENT,可以設置為任意值,但Y最安全 - 表示雙引號總是圍繞分隔標識符,單引號總是圍繞字符串。)

請注意,MS SQL Server設法使用方括號中的[分隔標識符]。 它看起來很奇怪,當然不是SQL標準的一部分。


當表列序列已知時簡單插入:

    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

要在第一個答案中添加一些內容,當我們只需要來自另一個表的少量記錄時(在本例中只有一個):

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

這對我有效:

insert into table1 select * from table2

這句話與甲骨文有點不同。


這是使用select使用值的另一個示例:

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

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

這適用於所有DBMS


select *
into tmp
from orders

看起來不錯,但只有在tmp不存在時才有效(創建並填充)。 (SQL服務器)

要插入到現有的tmp表中:

set identity_insert tmp on

insert tmp 
([OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry] )
      select * from orders

set identity_insert tmp off




ansi-sql-92