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