2014-11-05 126 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