Oracle数据库如何查询同列超集并仅返回超集行
在Oracle中筛选同一列的超集行(或无对应子集的行)
样本数据表
| ID | Value |
|---|---|
| 1 | abc |
| 2 | abcd |
| 3 | abcde |
| 4 | xyz |
| 5 | lmn |
| 6 | lmno |
需求说明
需要筛选出两类行:
- 是其他行值的超集(即没有其他行的值包含它,它是同一组中的最大包含项)
- 没有任何对应子集的行(即没有其他行的值是它的子集)
最终期望返回ID为3、4、6的行。
解决方案SQL
SELECT t1.ID, t1.Value FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.ID != t1.ID AND t2.Value LIKE '%' || t1.Value || '%' );
逻辑解释
- 核心通过
NOT EXISTS子查询判断当前行是否被其他行的值包含:t2.ID != t1.ID排除行自身的对比t2.Value LIKE '%' || t1.Value || '%'检查是否存在其他行的值包含当前行的值
- 如果不存在这样的
t2行,说明当前行要么是某组中的最大超集,要么没有任何子集,符合需求。
执行结果
| ID | Value |
|---|---|
| 3 | abcde |
| 4 | xyz |
| 6 | lmno |
内容的提问来源于stack exchange,提问作者Manjunath N
相关产品推荐
相关产品推荐

