如何查询满足特定条件的重复值行?SQL数据表筛选求助
SQL查询实现方案
数据表结构
现有数据表结构及数据如下:
country | group | offer | type | list --------|-------|-------|------|----- UK | A | 1 | AA | 1 UK | A | 2 | BB | 1 UK | A | 3 | CC | 2 IE | A | 4 | AA | 2 IE | A | 5 | BB | 2 IE | A | 6 | CC | 1 UK | B | 7 | AA | 3 UK | B | 8 | BB | 4 UK | B | 9 | CC | 4
查询要求
需要返回满足以下两个条件的所有行:
- 行的
type字段值为CC - 该行的
list值,与同一country、同一group下,type为AA或BB的行的list值一致
期望结果
country | group | offer | type | list --------|-------|-------|------|----- UK | B | 9 | CC | 4
实现方法
方法一:使用EXISTS子查询
通过子查询验证当前CC类型的行,是否在同country、同group下存在AA/BB类型且list值匹配的行:
SELECT t.* FROM your_table t WHERE t.type = 'CC' AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.country = t.country AND t2.group = t.group AND t2.type IN ('AA', 'BB') AND t2.list = t.list );
方法二:使用自连接查询
通过自连接关联同country、同group的行,筛选出符合条件的记录,用DISTINCT避免重复结果:
SELECT DISTINCT t.* FROM your_table t JOIN your_table t2 ON t.country = t2.country AND t.group = t2.group AND t.list = t2.list WHERE t.type = 'CC' AND t2.type IN ('AA', 'BB');
两种方法都能实现需求:EXISTS子查询在数据量较大时通常性能更优,找到匹配项后就停止查找;自连接的方式逻辑更直观,便于理解关联关系。
内容的提问来源于stack exchange,提问作者SRJCoding
相关产品推荐
相关产品推荐

