【问题标题】:Merge 2 tables in SQL and save into 1 new table在 SQL 中合并 2 个表并保存到 1 个新表中
【发布时间】:2015-01-01 05:51:39
【问题描述】:

如果我们有两个或多个具有相同列的表

表 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 行
';' 附近的语法不正确。

任何大师都可以提供一些cmets吗?谢谢!

【问题讨论】:

标签: sql sql-server merge


【解决方案1】:
create table Amide_actives_decoys
as
select Structure, Name, Active from 
(
SELECT * FROM Amide_decoys 
UNION
SELECT * FROM Amide_actives 
)
;

【讨论】:

  • 最好解释您的答案,而不仅仅是发布代码,因为 OP 可能并不完全遵循仅代码的答案。
【解决方案2】:

在您的两个答案中,问题是您没有为此表提供别名。我认为您在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

【讨论】:

  • 回答也很好,很详细!但是,这里我们确实需要 UNION ALL 否则会丢失一些数据!
【解决方案3】:

一般语法是

INSERT INTO table2
SELECT * FROM table1;

在这种情况下你可以选择 INTO 语句

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

select *From #tabletest

【讨论】:

    【解决方案4】:

    我认为您需要UNION ALL 否则您可能无法捕获所有数据;取决于表中的数据(重复等)。

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

    【讨论】:

    • 感谢 Simon1979!这里我们确实需要 UNION ALL 否则会丢失一些数据!
    【解决方案5】:

    此语法适用于不同的数据库:

    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 语句中使用任何有效的子查询。

    【讨论】:

    • +1 不错的答案。如果可能的话,请添加解释,这会很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多