2016-02-12 107 views
0

我有一个表_id,名称。我使用SQLite3查询来获取给定id的名称,如下面的api。返回重复项

getName(id) >> Query "select name from table where _id=id" 

和ID数组这个其他方便的API,返回的行(名称)必须申请ID的顺序相匹配。

getNames(ids) >> 
    /* Returned text must be ordered */ 
    var ordClause='ORDER BY CASE _id'; 
    for(var i=1;i<=ids.length;i++){ ordClause += ' WHEN '+ids[i-1]+' THEN '+i; } 
    ordClause += ' END'; 
    Query "select name from table where _id in("+ids+") "+ordClause 

当给定的ids有重复值时,会出现问题。冗余ID仅映射到第一个ID。因此返回的行可能少于请求的ID。

我该如何解决这个问题?

+0

重复的ID是只是恼人。使用大型数据库时,需要很多时间才能执行,但我会将所有数据转储到具有新的唯一ID字段的新表结构中,并将old_ids保留为临时引用。我不确定这是否是一个好主意... – SebasSBM

+0

如果数据量太大,我的方法可能是最糟糕的...... – SebasSBM

+0

其实这个解决方案的数据太大了,冗余情况是非常罕见,极少数API调用在角落用例中有冗余ID。我应该巧妙地找到这个特殊情况的解决方案。 –

回答

1

SELECT查询返回与WHERE子句中的筛选器匹配的所有行。 IN集中的冗余ID不会改变单个行匹配该过滤器的事实。

如果你真的想重复行,你必须写一个单独的查询为他们每个人:

SELECT name FROM MyTable WHERE ID = 7 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 8 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 8 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 7 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 1; 
+0

正确的“ORDER BY永不删除行”,但在(list_with_redundancies)中选择。也许这是解决问题的根本原因。 –

+0

'IN(...)'不会删除匹配的行。 –

+0

'从表中选择名称,其中(7,8,8,7,1)'中的_id只返回3行。 –