如何删除数据库中的特定单词?

时间:2016-05-18 07:40:06

标签: sql sql-delete

我将尝试用解释来解释因为它有点复杂。如果表的根已经存在,我想从我的SQL表中删除单词。所以我的表结构就像这样

Words  Scores
car       5
book      11
cars       2
pen        10
tool       4
car's      8
tools      2

所以在这种情况下,由于汽车是汽车和汽车的根源,工具是工具的根源,我想删除它们并在根词上添加他们的分数并得到我的表格这样;

Words  Scores
car       15
book      11  
pen       10
tool       6

不是:如果列表中有“a”,则所有以“a”开头的单词将被删除:为此,我考虑过如果情况如此; if (string[i].Length>=3)但是当然它不会避免所有可能性,可能会有“预订”和“预订”字样,所以预订将被删除,但没关系。

2 个答案:

答案 0 :(得分:3)

好吧,如果你没有包含root和childs的关系表,我想不出更简单的解决方案,但你可以尝试这样的事情 - 分两步,第一步是更新分数,第二步删除孩子们:

UPDATE YourTable t
SET t.Scores =(SELECT sum(s.scores) FROM YourTable s
               WHERE s.words like concat('%',t.words,'%'))

编辑:或此

update t
set t.score=sum(s.score) 
from YourTable t
INNER JOIN YourTable s
 ON (s.words like concat('%',t.words,'%'))

这将更新每个孩子(看起来相似)总分。

然后删除:

DELETE FROM YourTable t
WHERE t.words in(SELECT s.words FROM YourTable s
                 WHERE t.words like concat('%',s.words,'%')
                 AND t.words <> s.words)

这将删除所有与另一个单词的子(相似)的记录。它不适用于任何DBMS,因此这里有另一个版本的连接(更新连接语法不同,从一个db到另一个):

DELETE FROM YourTable t
INNER JOIN YourTable s
 ON(t.words like concat('%',s.words,'%')
    AND t.words <> s.words)

您未提供RDBMS,因此这是ANSI-SQL的答案。 这是未经测试的,因此请检查它是否有效。

编辑:请记住,如果没有root-child表,将会有一些不起作用的异常,并可能导致不必要的更新/删除。你必须制定一个单词是否是另一个单词的孩子的规则,这个单词没有任何预期(我不知道它是否可能使用sql)。

我最好的建议 - 自己填充这样的表,插入所有root-child选项,并使用此表进行删除/更新,这样可以确保不会出错。

答案 1 :(得分:1)

这是一个找到一些常见案例的开始。作为仅考虑3个或更多字符的单词的第一步,这是合理的。

select distinct w2.word from words w inner join words w2
on w.word = w2.word + 's'
    or w.word = w2.word + '''s'
    or w.word = w2.word + 'ing'
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'ed'    
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'y'
where len(w.word) >= 3

删除派生词:

delete w from words w inner join words w2
on w.word = w2.word + 's'
    or w.word = w2.word + '''s'
    or w.word = w2.word + 'ing'
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'ed'    
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'y'
where len(w2.word) >= 3

要计算单词数,您可以这样做: 我确定有一种更优雅的方法可以做到这一点,并在找到时更新这篇文章。 首先添加一个视图,或者如果你不能这样做,创建一个临时表#root_words并在其中插入以下内容。

create  view root_words as
select distinct w2.word as root_word, w.word as derived_word 
from words w inner join words w2
on w.word = w2.word + 's'
    or w.word = w2.word + '''s'
    or w.word = w2.word + 'ing'
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'ed'    
    or w.word = w2.word + substring(w2.word, len(w2.word), 1) + 'y'
where len(w2.word) >= 3 

然后,此查询执行union以包含类似&#34; dog&#34;等字词。这些不是来自任何其他词。否则他们将被计入错过。

select x.root_word, count(*) 
from 
(
    select rw.root_word, rw.derived_word
    from words w
    inner join root_words rw on w.word = rw.root_word
    -- add words which aren't derived from any other word
    union all
    select w.word as root_word, null as derived_word
    from words w
    left join root_words rw on w.word = rw.derived_word
    where rw.root_word is null
) x
group by x.root_word