【问题标题】:Merge tables having different columns (SQL Server)合并具有不同列的表 (SQL Server)
【发布时间】:2016-03-04 18:56:57
【问题描述】:

我有 2 个表格,详细信息如下

表 1

Name | City | Employee_Id
-----------------
Raj  | CA   | A2345
Diya | IL   | A1234
Max  | PL   | A2321
Anna | TX   | A1222
Luke | DC   | A5643

表 2

Name | City | Employee_Id | Phone | Age
---------------------------------------
Raj  | CA   | A2345       | 4094  | 25
Diya | IL   | A1234       | 4055  | 19
Max  | PL   | A2321       | 4076  | 23

如您所见,Employee_Id 是两列中的公共列。我想将表 1 中的所有条目更新到表 2 中。

Raj、Divya 和 Max 已经存在于表 2 中。因此它不应在表 2 中创建重复条目并跳过这 3 个条目,而 Anna 和 Luke 不存在于表 2 中。因此应将其添加为新条目排。

SQL 应该能够合并这 2 列并忽略已经存在的行。决赛桌2必须与此类似。

表 2

Name | City | Employee_Id | Phone | Age
---------------------------------------
Raj  | CA   | A2345       | 4094  | 25
Diya | IL   | A1234       | 4055  | 19
Max  | PL   | A2321       | 4076  | 23
Anna | TX   | A1222       |       |   
Luke | DC   | A5643       |       |   

有没有办法实现这一点?我对 SQL 很陌生,所以任何输入都会有很大帮助。我阅读了有关合并和更新功能的信息,但我猜合并是在 Transact-SQL 中。还阅读了有关连接的信息,但找不到解决此问题的方法。

【问题讨论】:

  • Sql Server 还是 MySql ?
  • @JuanCarlosOropeza-sql 服务器
  • Raj / OH / A2345 怎么样?不允许使用相同的员工 ID 移动或更改姓名?您想要的是重复的员工 ID?
  • @JoachimIsaksson- Employee_ID 将是唯一的.. 在插入 table2 之前需要检查此参数。如果 table2 的employee_id 为 A2345,则不会再次插入...
  • 如果找到上面提到的行怎么办?使用 table1 中的正确数据更新该行,还是忽略 table1 中的行?

标签: sql-server database join merge rdbms


【解决方案1】:

演示设置

CREATE TABLE Table1
    ([Name] varchar(4), [City] varchar(2), [Employee_Id] varchar(5));

INSERT INTO Table1
    ([Name], [City], [Employee_Id])
VALUES
    ('Raj', 'FL', 'A2345'),
    ('Diya', 'IL', 'A1234'),
    ('Max', 'PL', 'A2321'),
    ('Anna', 'TX', 'A1222'),
    ('Luke', 'DC', 'A5643');

CREATE TABLE Table2
    ([Name] varchar(4), [City] varchar(2), [Employee_Id] varchar(5), [Phone] int, [Age] int);

INSERT INTO Table2
    ([Name], [City], [Employee_Id], [Phone], [Age])
VALUES
    ('Raj', 'CA', 'A2345', 4094, 25),
    ('Diya', 'IL', 'A1234', 4055, 19),
    ('Max', 'PL', 'A2321', 4076, 23);

合并查询

MERGE Table2 AS target
    USING Table1 AS source 
    ON (target.[Employee_Id] = source.[Employee_Id])
    WHEN MATCHED THEN 
        UPDATE SET [Name] = source.[Name],
                   [City] = source.[City]
WHEN NOT MATCHED THEN
    INSERT ([Name], [City], [Employee_Id], [Phone], [Age])
    VALUES (source.[Name], source.[City], source.[Employee_Id], NULL, NULL);

SELECT *
FROM Table2    

【讨论】:

  • 感谢您的快速回复。我收到以下错误 - Invalud column name 'name',invalid column name 'City' 等等
  • 你给我们正确的数据库模式了吗?我只是使用这个函数 sintaxis ... w3schools.com/sql/sql_insert_into_select.asp
  • 这个查询是否涵盖了上述 cmets 中 Joachim Isaksoon 提到的测试用例?
  • 不,这仅适用于插入,您需要单独的更新指令。让我看看有没有合并指令
  • 使用MERGE 找到了更好的方法。这样您就可以处理更新和插入。如果您有兴趣,也可以选择删除mssqltips.com/sqlservertip/1704/…
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多