我一直在试图解决这个问题一段时间了。希望任何人都可以在这里提供帮助。
我的文章表中有一个分号分隔的类别 ID(例如 ;2;34;5;9;),我有一个类别表,其中包含旧的类别 ID 列和新的类别 ID 列。现在,我想使用一些基于原始类别ID的新类别ID更新文章表中的类别ID。例如(例如;2;34;5;9;)将更新为(例如;564;344;753;944;)
我需要这样做的原因是因为我正在合并两个数据库中具有相同表设置的表。
我知道这是一个糟糕的设计,但它已经持续了很长时间。我真的想不出解决方案,任何帮助将不胜感激。
是的,这是一个糟糕的设计。
我想你使用MySQL。我已经使用了GROUP_CONCAT MySQL特色函数,但您也可以在MSSQL中模拟它。我想你需要用新的替换所有旧的 Id。
SQLFiddle demo
表:
create table article(id int, CategoryID varchar(200));
create table Category(OldCategoryId int, newCategoryId int);
并更新以替换组:
update article,
(select
article.id,
CONCAT(';',
GROUP_CONCAT(cast(newCategoryID as char) separator ';'),
';') newGroups
from category
left join article on CategoryId like CONCAT('%;',CAST(oldCategoryId as char),';%')
group by article.id) t1
SET article.CategoryId=t1.newGroups
where article.id=t1.id
对于这些事情,MySQL提供了
find_in_set
的功能。但是,SQL Server(如果您正在使用)不直接支持CSV
的IN
谓词,也不提供find_in_set
。它需要一个rowset
IN
谓词才能工作......
查看上面CTE
示例的链接。
你需要一个脚本/程序来构造旧的和新的CategoryID映射,并浏览你的文章表并通过查找地图来替换它。
也许过程程序可以(如果你的DBMS支持像存储的proc/PLSQL这样的过程),否则使用Java/C#/Php更容易做到这一点