我将尝试用解释来解释因为它有点复杂。如果表的根已经存在,我想从我的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)
但是当然它不会避免所有可能性,可能会有“预订”和“预订”字样,所以预订将被删除,但没关系。
答案 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