【问题标题】:Select unique records in sqlite在 sqlite 中选择唯一记录
【发布时间】:2012-09-27 02:04:33
【问题描述】:

考虑一个表格

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

请指教。

【问题讨论】:

  • 如果有重复值(source-5),key 怎么可能是主键?

标签: sql sqlite select


【解决方案1】:

一种方法是使用 GROUP BY 和 HAVING 生成具有所需 ids 的派生表,然后加入它:

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
)

【讨论】:

  • 这里真的需要子查询吗?使用问题 SQLite3 中的数据进行测试为我提供了仅适用于 SELECT id, key, value FROM t GROUP BY id HAVING count(*) == 1; 的正确结果。我的 SQL-fu 不够强大,无法知道这是否总是有效。
  • @JohnBartholomew:不适用于 SQLite(和 MySQL),但适用于大多数其他数据库。如果您不使用派生表来生成您想要的ids,那么许多数据库会抱怨选择未聚合和未分组的列。像select a, b from t group by a 这样的东西是模棱两可的(你应该为重复的as 选择哪个b?)所以很多数据库抱怨,有些只是悄悄地抓住b。大多数数据库也会抱怨==
猜你喜欢
  • 2023-01-18
  • 2011-03-02
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2020-03-17
相关资源
最近更新 更多