2014-11-05 109 views
3

如果我們有相同的列合併2表中的SQL,並保存到1個新表

表1

Structure, Name, Active 
1,A,1 

表兩個或多個表2

Structure, Name, Active 
2,B,0 

我們想將這兩個表結合並將其保存到新的表中

新表

Structure, Name, Active 
1,A,1 
2,B,0 

下面是代碼

CREATE TABLE Amide_actives_decoys 
(
    Structure NVARCHAR(255), 
    Name NVARCHAR(255), 
    Active INT 
) 
GO 

INSERT Amide_actives_decoys 
FROM (
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives 
) 

以下錯誤信息會顯示出來

消息156,15級,狀態1,行10關鍵字「FROM
附近有語法錯誤」。

同樣的事情,如果我們使用

SELECT * INTO Amide_actives_decoys 
FROM (
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives 
) 

按照這個答案

Joining a table onto itself in SQL and saving the result

的錯誤信息會

消息102,級別15,狀態1 ,第5行
「;」附近的語法不正確。

任何大師能否提供一些意見?謝謝!

+0

PLZ指這樣的:HTTP:// blog.sqlauthority.com/2012/08/29/sql-server-three-methods-to-insert-multiple-rows-i nto-single-table-sql-in-sixty-seconds-024-video/ – Backtrack 2014-11-05 05:49:53

回答

6

該語法同樣適用在不同的數據庫:

INSERT INTO Amide_actives_decoys(Structure, Name, Active) 
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives; 

在這種形式的INSERT,子查詢的輸出成爲設定爲INSERT 輸入值。

請注意,SELECT語句 子查詢中的表達式的數據類型必須與INSERT 語句的目標表中的數據類型匹配。

子查詢返回的所有行都插入到 Amide_actives_decoys表中。

如果由於違反約束或 數據類型衝突而導致任何一行的INSERT失敗,則整個INSERT失敗並且不插入任何行。

在INSERT語句中可以使用任何有效的子查詢。

+0

+1不錯的答案。如果可能,PLZ添加解釋會很好:) – Backtrack 2014-11-05 05:49:10

3

我想你需要UNION ALL否則你可能無法捕獲所有的數據;取決於表中的數據(重複等)。

INSERT INTO Amide_actives_decoys(Structure, Name, Active) 
    SELECT * FROM Amide_decoys 
    UNION ALL 
    SELECT * FROM Amide_actives; 
+0

謝謝Simon1979!在這裏,我們確實需要UNION ALL,否則一些數據會丟失! – Chubaka 2014-11-05 07:18:13

1

一般語法

INSERT INTO table2 
SELECT * FROM table1; 

你可以在這種情況下

with cte as (select 1 col1 ,2 col2 
union all 
select 2,3) 
select * into #tabletest from cte 

select *From #tabletest 
1

在這兩種答案SELECT INTO語句,問題是,你沒有給一個別名爲結果表。我想你也錯過了INSERT聲明中的'INTO'。

查詢1:

CREATE TABLE Amide_actives_decoys 
(
    Structure NVARCHAR(255), 
    Name NVARCHAR(255), 
    Active INT 
) 
GO 

INSERT INTO Amide_actives_decoys 
SELECT * 
FROM (
     SELECT * FROM Amide_decoys 
     UNION 
     SELECT * FROM Amide_actives 
     ) LU --LU is added. 

對於查詢1,下面也是正確

INSERT INTO Amide_actives_decoys 
SELECT * FROM Amide_decoys 
UNION 
SELECT * FROM Amide_actives 

問題2:

SELECT * 
INTO Amide_actives_decoys 
FROM (
     SELECT * FROM Amide_decoys 
     UNION 
     SELECT * FROM Amide_actives 
     ) LU -- LU added 
+1

好的和詳細的答案呢!但是,在這裏我們確實需要UNION ALL,否則一些數據會丟失! – Chubaka 2014-11-05 07:19:26

+0

是的,UNION ALL也應該記住。 – 2014-11-05 08:05:29

0
create table Amide_actives_decoys 
as 
select Structure, Name, Active from 
(
SELECT * FROM Amide_decoys 
UNION 
SELECT * FROM Amide_actives 
) 
; 
+0

最好解釋你的答案,而不僅僅是發佈代碼,因爲OP可能並不完全遵循代碼的唯一答案。 – SuperBiasedMan 2016-08-11 10:37:32