查询基于许多组合键检索数据

时间:2014-08-12 20:20:55

标签: sql database informix

不幸的是,我支持的数据库包含很少甚至没有代理/主键,并且没有机会添加一个。所以我离开了使用复合键。

我希望使用复合键列表查询单个表。我可以拥有多达5k的复合键。那我该怎么做呢?以下查询有效,但我必须动态构建它,而不是我见过或不得不做的事情。似乎应该有更好的方法来做到这一点......

select * from dog_manners
where 
col1 NOT IN ('', 'abcd')
and
(
    -- here are the composite keys (each pair must be unique)
    (col2 = 'Scottish Terrier' and col3 = 'black') or
    (col2 = 'Golden Retriever' and col3 = 'brown') or
    (col2 = 'Golden Retriever' and col3 = 'wheaten') or
    (col2 = 'Yorkshire Terrier' and col3 = 'brown') or
    etc...
)

如果这是最好的方式,我可以拥有的OR条件数量是否有限制?如果是这样,我将不得不把它分解成更小的块。

2 个答案:

答案 0 :(得分:1)

我不知道informix所以我用Google搜索,看起来好像是临时表。一个想法是创建一个并在连接中使用它:

CREATE TEMP TABLE tmp1 ( col2 varchar(20), col3 varchar(20) );
INSERT INTO tmp1 (col2, col3) VALUES ('Scottish Terrier', 'black')
                                   , ('Golden Retriever', 'brown');
SELECT * 
FROM dog_manners x
JOIN tmp1
    ON tmp1.col2 = x.col2
   AND tmp1.col3 = x.col3;

答案 1 :(得分:1)

我不确定我是否建议这样做,但没有更多细节来了解您的要求

  

但需要动态构建

以下替代方案可行,但可能效率不高:

select * from dog_manners
where 
col1 NOT IN ('', 'abcd')
and TRIM(col2)||':'||TRIM(col3) IN 
(
    'Scottish Terrier:black', 'Golden Retriever:brown',
    'Golden Retriever:wheaten', 'Yorkshire Terrier:brown',
    ...
)

您能否详细说明如何生成这些组合?