2014-10-27 80 views
1

我们有'defs'表(定义为TEXT,ref为INT),其中def是单词的定义,ref是对单词的引用。删除所有子字符串

目标:

我需要为每个定义(DEF)删除所有重复定义(这将被包含在一个最长的一个)

初始条件:

  1. 原料计数为300000

  2. 定义长度可以是5 000个符号。

实施例:

DEFS:

  • 动物大耳 - 1

  • 动物大耳和大鼻子 - 1

  • 大动物与尾 - 1种

  • 小毛茸哺乳动物 - 2

  • 小毛皮哺乳动物灰色尾 - 2

输出:

  • 动物与有点耳朵和大鼻子 - 1

  • 与灰尾巴毛茸茸的小哺乳动物 - 2

想法与哈希码,但我不能完成我的想法:(

不知道如何把它做?

+0

您正在使用什么版本的SQL Server?请不要使用'text'为您的数据,它的弃用,现在仅向后兼容 – Lamak 2014-10-27 16:41:58

回答

2

会这样的工作吗?

declare @table table(def text, ref int); 

insert into @table 
values 
('Animal with bit ears', 1), 
('Animal with bit ears and big nose', 1), 
('Big animal with tail', 1), 
('Small furry mammal', 2), 
('Small furry mammal with gray tail', 2) 
; 

delete defs 
from (
    select row_number() over (
      partition by ref order by DATALENGTH(def) desc 
      ) rank_ 
    from @table 
    ) defs 
where defs.rank_ > 1; 

select * from @table; 
+0

这真棒!适用于我。谢谢! – 2014-10-27 16:55:02

+0

需要注意的是,如果两行具有“def”相等的数据长度,那么将任意选择一个。如果这不是你想要的,你可以使用'rank'而不是'row_number'。 – Will 2014-10-27 16:58:27

+0

如果它的正确答案,你可以考虑将其标记为正确的答案。 – Will 2014-10-28 18:18:23

相关问题