我有一张这种格式的大表(20,000,000多行):
id ref feature val
1 a pos pc
2 a gen m
3 a syll Cv
4 b pos pc
5 b L5 harry
6 c syll Cv
7 d gen m
如何选择满足多对feature + val?
的ref列表 E.g。 Select distinct ref where feature='pos' and val = 'pc'
,给出a,b
Select distinct ref where feature = 'gen' and val= 'm'
给出了a,d
但是,对于那些feature='pos' and val = 'pc'
参考号为feature = 'gen' and val= 'm'
的参考号,如何返回合并参数a,b和d?
我需要能够在同一搜索中将解决方案扩展到许多这样的对。
搜索需要快速,因此对索引的建议也会有所帮助。
我应该从同一个表中选择N次,每个功能+一对吗?如果是这样,怎么样?
答案 0 :(得分:1)
您可以使用“OR”选择类似的组合:
Select distinct ref
from table
where ( feature='pos' and val = 'pc')
or ( feature = 'gen' and val= 'm' )
如果这会变得太笨重,你可能想要将你的feature / val组合移动到另一个表中并对其进行连接。
如果你有一个名为join_table的连接表(现在有一个灵感来自名字!),其中包含feature和val列,你可以这样做:
select distinct ref
from table t
inner join join_table j on t.feature = j.feature and t.val = j.val
答案 1 :(得分:0)
通常,您会使用OR
语句添加其他条款
SELECT DISTINCT ref
FROM YourTable
WHERE (feature = 'pos' AND val = 'pc')
OR (feature = 'gen' AND val = 'm')
...
通过连接feature
和val
上的持久性计算列,您可以简化。
SELECT DISTINCT ref
FROM YourTable
WHERE (featureval = 'pospc')
OR (featureval = 'genm')
但OR
语句的链接仍然存在。
<强>索引强>
必须通过查看执行计划来评估每个语句的性能,但对于给定的语句,(feature, val, ref)
上的覆盖索引不会受到影响。
答案 2 :(得分:0)
sqlite> CREATE TABLE t (id INT, ref VARCHAR, feature VARCHAR, val VARCHAR);
sqlite>
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (1, "a", "pos", "pc");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (2, "a", "gen", "m");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (3, "a", "syll", "Cv");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (4, "b", "pos", "pc");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (5, "b", "L5", "harry");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (6, "c", "syll", "Cv");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (7, "d", "gen", "m");
sqlite>
sqlite> SELECT DISTINCT ref FROM t WHERE (feature = 'pos' AND val = 'pc') OR (feature = 'gen' and val= 'm');
a
b
d
sqlite>
运行时间应该是线性的,2000万行可能看起来很大,但它不应该是当今硬件和大多数实现的大问题,再次索引过滤器类型可能会提高性能,确保您的行是固定的宽度也可能略有改善。
如果您需要更多配置,只需使用OR
添加它们即可获得您的想法,我建议对其进行测试,并查看查询需要多长时间,我认真地怀疑它会很长,尽管我不会# 39;不了解系统或你正在使用的实现,所以我真的不能说太多。