如何使用SQL提取仅包含"upload"类型的唯一ID
解决方案:提取仅含
upload类型的唯一ID 这问题我日常写SQL时经常碰到,核心就是要筛选出那些**所有关联记录的type字段都是upload**的ID,排除掉存在其他类型(比如out、delete)的ID。下面给你几种实用的实现方式,适配大多数主流数据库:
方法1:GROUP BY + HAVING(最直观通用)
这是最容易理解的写法,通过分组后过滤条件来实现:
SELECT id FROM your_table_name GROUP BY id HAVING COUNT(DISTINCT type) = 1 AND MAX(type) = 'upload';
逻辑说明:
GROUP BY id将同一ID的所有记录归为一组COUNT(DISTINCT type) = 1确保该ID只有一种类型MAX(type) = 'upload'验证这唯一的类型就是upload(用MIN(type)也可以,因为只有一种值)
方法2:NOT EXISTS(性能友好,适合大数据表)
如果你的表数据量较大,这种利用子查询排除不符合条件的写法通常性能更优,尤其是当id和type字段有索引时:
SELECT DISTINCT id FROM your_table_name t1 WHERE type = 'upload' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.id = t1.id AND t2.type != 'upload' );
逻辑说明:
- 先筛选出所有
type为upload的ID - 再通过
NOT EXISTS排除掉那些存在非upload类型记录的ID,剩下的就是仅含upload的ID
方法3:EXCEPT(部分数据库支持)
如果你的数据库支持EXCEPT语法(比如PostgreSQL、SQL Server),可以用集合差的思路来实现:
SELECT DISTINCT id FROM your_table_name WHERE type = 'upload' EXCEPT SELECT DISTINCT id FROM your_table_name WHERE type != 'upload';
逻辑说明:
- 先获取所有包含
upload类型的ID集合 - 减去所有包含非
upload类型的ID集合,最终结果就是仅含upload的ID
你可以根据自己使用的数据库和数据规模选择合适的写法,亲测这几种方法都能得到你期望的bb、q5结果~
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

