2012-09-27 109 views
1

考虑一个表在sqlite中选择唯一记录

results(id,key,value)其中key是主键。

的样本数据:

id | key  | value 
----------------------- 
abc| source-1 | 20 
abc| source-2 | 30 
abc| source-3 | 2 
abc| source-4 | 10 
def| source-5 | 1 
ghi| source-6 | 25 
jkl| source-5 | 13 

我想回只有对一个给定id的单次入境的记录。所以输出应该是

id | key  | value 
------------------------ 
def| source-5 | 1 
ghi| source-6 | 25 
jkl| source-5 | 13 

请指教。

+0

如果存在重复值('source-5'),'key'如何能成为主键? – beny23

回答

3

的一种方法是使用GROUP BY和HAVING产生派生表与所需id秒,然后连接到这里:

select results.* 
from results 
join (
    select id 
    from results 
    group by id 
    having count(*) = 1 
) as dt on results.id = dt.id 

你也可以使用一个IN如果你不喜欢派生表:

select * 
from results 
where id in (
    select id 
    from results 
    group by id 
    having count(*) = 1 
) 
+1

这里实际需要子查询吗?使用SQLite3中的数据进行测试,仅为'SELECT id,key,value FROM t GROUP BY id HAVING count(*)== 1;'提供了正确的结果。我的SQL-fu不够强大,不知道它是否会始终有效。 –

+1

@JohnBartholomew:不适用于SQLite(和MySQL),但适用于大多数其他数据库。如果你不使用派生表来生成你想要的'id',很多数据库会抱怨选择未聚合和未分组的列。诸如'select a,b from a group by a'是不明确的(你应该选择'b'来重复'a's?)这么多的数据库都会抱怨,有些只是悄悄地抓住一个'b'。大多数数据库也会抱怨'=='。 –