sqlserver数据一对多合并_SQLServer合并多对多表的数据

sqlserver数据一对多合并_SQLServer合并多对多表的数据

2023年7月13日发(作者:)

sqlserver数据⼀对多合并_SQLServer合并多对多表的数据点击上⽅蓝字关注“汪宇杰博客”今天还是发⼀篇⽼⽂。介绍当时我合并博客⽂章数据时遇到的⼀个问题和解决⽅法。我不擅长SQL,如果⼤家有更好的⽅法,欢迎在评论⾥留⾔讨论。最近在整理博客的数据,需要做⼀个操作就是合并⽂章的分类。我的博客中⽂章和分类是多对多的关系。即⼀篇⽂章可以属于多个分类,⼀个分类可以包含多篇⽂章。这是⼀个很典型的多对多关系,我⽤的是⼀个多对多的表,做联合主键关联这些数据。就像这样:我需要做的是把“DotNetBeginner”这个分类的⽂章移到“CSharpAndDotNet”分类⾥去。但是因为原先在“DotNetBeginner”⾥的⽂章有些也是属于“CSharpAndDotNet”的,所以直接Update关联表的话,会产⽣重复的联合主键,就会爆。直观⼀点看,写个SQL语句查询出原分类(DotNetBeginner)和⽬标分类(CSharpAndDotNet)中的数据:DECLARE @SourceCatId AS UNIQUEIDENTIFIER, @TargetCatId AS UNIQUEIDENTIFIERSET @SourceCatId = '678A4011-40E0-4F75-BC23-1FFC25B72D4A'SET @TargetCatId = 'D58043FF-B3CB-43DA-9067-522D76D21BE3'SELECT , OM PostCategory AS pc INNER JOIN Post AS p ON = INNER JOIN Category AS c ON = ryIdWHERE ryId IN (@SourceCatId, @TargetCatId)结果如下图:《C#字符和ASCII码互转》这篇如果直接update分类到CSharpAndDotNet就会爆,因为PostCategory表中已经有⼀条这样的记录了。但是像《上海轨道交通……》那篇就可以直接update。解决这个问题的思路分两步:1. 删除如《C#字符和ASCII码互转》这种的会爆破联合主键的记录2. 更新关联表,把旧分类的ID改成新分类那么⾸先我们要知道有哪些记录是符合被删除的条件的,把这些⽂章的ID找出来,⽤⼀个group by having就可以爆出来:SELECT FROM PostCategory AS pcWHERE ryId IN (@SourceCatId, @TargetCatId)GROUP BY HAVING COUNT(*) >= 2结果有10条:这10篇⽂章同时属于DotNetBeginner、CSharpAndDotNet和其他分类。为了直观的显⽰和之后删除操作⽅便,定义⼀个表变量叫temp,然后验证⼀下是哪些⽂章:DECLARE @Temp TABLE (PostId UNIQUEIDENTIFIER)INSERT INTO @Temp ( PostId )( SELECT FROM PostCategory AS pc WHERE ryId IN (@SourceCatId, @TargetCatId) GROUP BY HAVING COUNT(*) >= 2 )------------------------------------------------------------------------------SELECT -- , --ryId, OM PostCategory AS pc INNER JOIN Post AS p ON = INNER JOIN Category AS c ON = ryIdWHERE IN (SELECT FROM @Temp t)发现结果是正确的:然后就可以从关联表PostCategory中删除所有⽂章ID(PostId)在@Temp表中,且CategoryId对应DotNetBeginner的记录。然后⽤update语句完成⽂章分类的合并。-- Step 1. Delete records that will fuck up the primary keyDELETE

FROM PostCategoryWHERE CategoryId = @SourceCatId AND PostId IN (SELECT FROM @Temp t)-- Step 2. Update old key to new keyUPDATE PostCategorySET CategoryId = @TargetCatIdWHERE CategoryId = @SourceCatId最后验证⼀下,数据已经成功合并了。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689246302a225611.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信