Sql 将记录从一个表复制到另一个表时更改值
我使用以下代码将数据从一个表复制到另一个表:Sql 将记录从一个表复制到另一个表时更改值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我使用以下代码将数据从一个表复制到另一个表: INSERT INTO MyDb.Books (CategoryId, Author, Title) SELECT CategoryId, Author, Title FROM MyDbBackup.Books 复制CategoryId值时,我需要应用以下转换: +---------------------+-----------------+ | Old CategoryId | New CategoryId | +------
INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT
CategoryId, Author, Title
FROM MyDbBackup.Books
复制CategoryId值时,我需要应用以下转换:
+---------------------+-----------------+
| Old CategoryId | New CategoryId |
+---------------------+-----------------+
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
| 4 | 4 |
| 5 | 8 |
| 14 | 6 |
| 15 | 7 |
| 18 | 5 |
| 22 | 9 |
+---------------------+-----------------+
我如何才能做到这一点?您可以在
INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT
case when CategoryId = 1 then 2
when CategoryId = 2 then 1
when CategoryId = 5 then 8
when CategoryId = 14 then 6
when CategoryId = 15 then 7
when CategoryId = 18 then 5
when CategoryId = 22 then 9
else cateogoryId end, Author, Title
FROM MyDbBackup.Books
或者用一种不那么冗长的方式
INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT
case CategoryId
when 1 then 2
when 2 then 1
when 5 then 8
when 14 then 6
when 15 then 7
when 18 then 5
when 22 then 9
else cateogoryId end, Author, Title
FROM MyDbBackup.Books
正如Panagiotis Kanavos在评论中所说,您需要使用CASE表达式:
CASE CategoryID WHEN 1 THEN 2
WHEN 2 THEN 1
WHEN 5 THEN 8
WHEN 14 THEN 6
WHEN 15 THEN 7
WHEN 18 THEN 5
WHEN 22 THEN 9
ELSE CategoryID END
一种方法是将查找表用作联接: 另一种方法是使用大小写表达式。但是,使用联接可以确保结果集中只有具有旧ID的书籍集。因此,它同时执行查找和过滤
如果不需要筛选,可以使用左连接而不是内部连接。由于没有公式,因此必须逐个进行转换:
INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT CASE CategoryID WHEN 1 THEN 2
WHEN 2 THEN 1
WHEN 5 THEN 8
WHEN 14 THEN 6
WHEN 15 THEN 7
WHEN 18 THEN 5
WHEN 22 THEN 9
ELSE CategoryId ID END AS CategoryId
, Author, Title
FROM MyDbBackup.Books
您可以添加硬编码的CASE调用,也可以使用将一个ID映射到另一个ID的查找表进行连接。如果有公式,您可以将其添加到选择条款中。如果有任何要从旧类别转换为新类别的公式?@Md.SumanKabir否,没有公式。映射是按照我写的那样完成的。@TDP Yes是可能的,并且不太详细。。同时在开始处设置列并检查值..谢谢回答更新为YOUU建议Too还有什么其他目录?这是一个打字错误吗?你是想写其他类别吗?@RacilHilan是一个打字错误。答案更新。与CategoryId。。否则表示如果未重新映射该值,则select的categoryID与原样相同。。谢谢你的建议。是的,我知道这是什么意思,因为我在回答中有它;。您更新了一个查询,但忘记了第二个查询:。
INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT CASE CategoryID WHEN 1 THEN 2
WHEN 2 THEN 1
WHEN 5 THEN 8
WHEN 14 THEN 6
WHEN 15 THEN 7
WHEN 18 THEN 5
WHEN 22 THEN 9
ELSE CategoryId ID END AS CategoryId
, Author, Title
FROM MyDbBackup.Books