sql - 在 SQL 中使用修改后的关系复制同一个表中的数据

标签 sql sql-server database

我们需要将数据从一家公司复制到另一家公司,为此我们需要将一个表中存在的所有数据复制到同一个表中,但公司 ID 不同

表 1:员工

FName      Id   Department  CatId  CompanyId
Pratik      1    1            4       1
Praveen     2    2            3       1
Nilesh      3    2            3       1

表 2:组合值

Id   Fieldname  FieldValue  CompanyId
1    Department     IT        1
2    Department     HR        1
3    Category       Staff     1
4    Category       Manager   1

我想将表 1 和表 2 中的所有数据复制到同一个表中,并更新 companyid

下面的表 2 是查询 => 它按预期工作

INSERT INTO ComboValues (Fieldname,FieldValue, CompanyId)
(SELECT Fieldname,FieldValue,2 WHERE Companyid = 1)

结果

表 2:组合值

Id   Fieldname  FieldValue  CompanyId
1    Department     IT        1
2    Department     HR        1
3    Category       Staff     1
4    Category       Manager   1
5    Department     IT        2
6    Department     HR        2
7    Category       Staff     2
8    Category       Manager   2

问题:

但对于表 1,我无法执行相同的操作,因为表 2 中存在部门和类别的更新 ID 值

预期结果 表 1:员工

FName      Id   Department  CatId  CompanyId
Pratik      1    1            4       1
Praveen     2    2            3       1
Nilesh      3    2            3       1
Pratik      4    5            8       2
Praveen     5    6            7       2
Nilesh      6    6            7       2

我可以在 C# 中通过使用我想避免的循环来做同样的事情,并且只对 SQL 查询做同样的事情

最佳答案

你可以使用这个:

WITH tmp_table AS
(
    SELECT o.id AS id_old, n.id AS id_new
    FROM combovalues o
    INNER JOIN combovalues n 
    ON o.fieldname = n.fieldname AND o.fieldvalue = n.fieldvalue
    WHERE o.companyid = 1 AND n.companyid = 2
)
INSERT INTO employee (fname, department, catid, companyid)
SELECT fname, d.id_new, c.id_new, 2
FROM employee e
LEFT JOIN tmp_table d
ON e.department = d.id_old
LEFT JOIN tmp_table c
ON e.catid = c.id_old
WHERE companyid = 1;

测试于 rextester

关于sql - 在 SQL 中使用修改后的关系复制同一个表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54123797/

相关文章:

sql - 在 Oracle 中使用查询替换列中的字符串

SQL 查询和 RAM 问题

database - 数据库内内存——一个好主意?有什么经验吗?

java - 如何为我的 java 项目创建可安装的 msi 包?

sql - 如何自增非主键? - SQL服务器

mysql - Mysql中如何根据where子句获取记录?

sql - CTE 的意外结果

sql - ADO Connection.Execute 不断返回关闭的记录集

sql - 类似运算符的基础知识

mysql - 添加复合主键删除索引