sql-server - 关于在 T-SQL 中为我将要讲述的 CASE 设计更快算法的问题

标签 sql-server database algorithm tsql

这是案例

我有一个只有一个数据列的sql表,由一些组名组成。表格如下所示:

OPEN SYSTEMS SUB GR 
OPEN SYSTEMS SUB GR (GM/BTIB(1111)/BTITDBL(2222)/BTVY(4444)/ACSVTYSAG
INFRASTRUCTURE SOFT SUB GR 
INFRASTRUCTURE SOFT SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTUGBL(3333)/BTAUSGAG
MAIN SERVER ONLİNE SYS SUB GR (GM_BTIB(1111)_BTITDBL(2222)_BTSY(5555)_ANBOSAG
MAIN SERVER SUB GR 
MAIN SERVER SUB GR (GM_BTIB(1111)_BTITDBL(2222)_BTVY(4444)_ANBVTYSAG
XTM/YTM SUB GR 
XTM/YTM SUB GR (GM_BTIB(1111)_BTUGBL(3333)_BTAU(6666)_BTABAG
CARDS SUB GR (GM_BTIB(1111)_BTUGBL(3333)_BTKOU(7777)_BTBKAG
SYSTEMS DEV. SUB GR (GM_BTIB(1111)_BTSGBL(8888)_BTPB(9999)_BBASGAG
PERSONAL B. SUB GR 
PERSONAL B. SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTAU(6666)/BTBISAG

然后就这样继续下去。如您所见,某些组的名称重复,例如

PERSONAL B. SUB GR 
PERSONAL B. SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTAU(6666)/BTBISAG

我想做的是,我想用“较长版本的组名”更新“较短版本的组名”。例如,PERSONAL B.SUB GR 将替换为 PERSONAL B.SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTAU(6666)/BTBISAG 就像更新后的表格将如下所示。

OPEN SYSTEMS SUB GR (GM/BTIB(1111)/BTITDBL(2222)/BTVY(4444)/ACSVTYSAG
OPEN SYSTEMS SUB GR (GM/BTIB(1111)/BTITDBL(2222)/BTVY(4444)/ACSVTYSAG
INFRASTRUCTURE SOFT SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTUGBL(3333)/BTAUSGAG
INFRASTRUCTURE SOFT SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTUGBL(3333)/BTAUSGAG
MAIN SERVER ONLİNE SYS SUB GR (GM_BTIB(1111)_BTITDBL(2222)_BTSY(5555)_ANBOSAG
MAIN SERVER SUB GR (GM_BTIB(1111)_BTITDBL(2222)_BTVY(4444)_ANBVTYSAG
MAIN SERVER SUB GR (GM_BTIB(1111)_BTITDBL(2222)_BTVY(4444)_ANBVTYSAG
XTM/YTM SUB GR (GM_BTIB(1111)_BTUGBL(3333)_BTAU(6666)_BTABAG
XTM/YTM SUB GR (GM_BTIB(1111)_BTUGBL(3333)_BTAU(6666)_BTABAG
CARDS SUB GR (GM_BTIB(1111)_BTUGBL(3333)_BTKOU(7777)_BTBKAG
SYSTEMS DEV. SUB GR (GM_BTIB(1111)_BTSGBL(8888)_BTPB(9999)_BBASGAG
PERSONAL B. SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTAU(6666)/BTBISAG
PERSONAL B. SUB GR (GM/BTIB(1111)/BTUGBL(3333)/BTAU(6666)/BTBISAG

我的表包含 9000 条记录,我有一个算法可以做到这一点,但它运行缓慢,大约需要 3 分钟才能完成查询,但我想做的事情很简单。我需要一个更快的算法。

感谢您的帮助。

最佳答案

以基于集合的方式解决这个问题应该相对简单:

UPDATE a
SET  a.yourfield = b.yourfield 
FROM yourtable a 
INNER JOIN yourtable b on b.yourfield LIKE a.yourfield + '%' AND b.yourfield <> a.yourfield

这将进行模式匹配,但排除与自身的匹配——然而这并不理想,我猜在这个过程之后你将删除重复项或其他东西,因为有一个包含多个重复项且没有其他可区分值的表有点奇怪。

关于sql-server - 关于在 T-SQL 中为我将要讲述的 CASE 设计更快算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1831908/

相关文章:

ios - 获取每个 "OtherUser"解析核心数据库的最新记录

mysql - Perl DBI 连接不一致

sql - 记录添加到表中的时间的日期/时间戳?

database - Oracle Stored Proc - 我可以返回由许多其他 STRUCT 组成的复合 TYPE 吗?

asp.net - 如何使用 ASP.NET Core 更改迁移的输出文件夹?

php - 在 php 中生成独特的组合而不会耗尽内存

c# - 如何在特定 DataTable 行的剩余列中添加值?

sql - 在 sql 中从同一个表搜索两次总是返回排名较高的值

algorithm - 如何快速搜索书名?

algorithm - 汇编语言使用有符号整型乘法数学来执行移位