我有一个表格,其中包含文字中的单词(表格称为token
),每个单词都是表格中的一行。我想检索结果中的相邻单词。
示例: My name is Renato
必须返回:
My | name
name | is
is | Renato
以下查询有效,但速度很慢。 textblockid
确定单词所属的文本,sentence
是文本块中的句子数(但此时值为1),position
属性确定顺序的话。
select w1.text,w2.text
from token as w1,
(select textblockid,sentence,position,text from token
order by textblockid,sentence,position) as w2
where w1.textblockid = w2.textblockid
and w1.sentence = w2.sentence
and w1.position = w2.position - 1
有更好/更快的方法吗?
答案 0 :(得分:1)
我不太详细了解postgresql,但确保在sql server中查询更简单:
select w1.text,w2.text
from token as w1, token as w2
where w1.textblockid = w2.textblockid
and w1.sentence = w2.sentence
and w1.position = w2.position - 1
(我认为最好使用最简单的查询,剩下的用于优化器,这可能会被你的子查询误导。)
但是如果你有索引(textblockid,句子,位置)你真的不能用sql获得更多。
答案 1 :(得分:0)
第二个INNER JOIN
实例的token
表现更好。但这完全取决于列的数据类型以及您已有的索引。
例如,如果sentence
是文本列,则w1.sentence
和w2.sentence
之间的比较可能会非常昂贵。如果它是一个数字id(sentences
表的外键),并且如果列上有索引,则它应该更快。假设最后一个场景,你可以试试这个:
select w1.text,w2.text
from token as w1
INNER JOIN token as w2
ON w2.sentence = w1.sentence
AND w1.position = w2.position - 1
AND w1.textblockid = w2.textblockid