SQL - 组合来自同一个表的多个结果

时间:2012-06-26 06:09:50

标签: sql

我有一张这种格式的大表(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次,每个功能+一对吗?如果是这样,怎么样?

3 个答案:

答案 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')
         ...

通过连接featureval上的持久性计算列,您可以简化

  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;不了解系统或你正在使用的实现,所以我真的不能说太多。