Oracle查询技术需求:筛选同ID且VALUE全为W的记录及同列异值数据
我来帮你搞定这两个Oracle查询场景,直接上可落地的SQL方案:
需求1:查询某一列值相同但另一列值不同的记录
假设你的表名为target_table,需要找col_a值相同,但col_b值存在差异的记录。这里有两种常用实现方式:
方式1:GROUP BY + HAVING 先定位目标分组,再关联原表
先找出那些col_a有多个不同col_b值的分组,再关联原表拿到具体记录:
SELECT t.* FROM target_table t JOIN ( SELECT col_a FROM target_table GROUP BY col_a HAVING COUNT(DISTINCT col_b) > 1 ) g ON t.col_a = g.col_a;
这种方式的好处是先过滤出目标分组,再拉取数据,性能相对友好,适合数据量较大的表。
方式2:自连接对比
通过自连接,找到同一col_a下col_b不同的记录:
SELECT DISTINCT t1.* FROM target_table t1 JOIN target_table t2 ON t1.col_a = t2.col_a AND t1.col_b != t2.col_b;
这种写法更直观,但如果表数据量大,要注意给col_a和col_b加索引优化,避免全表扫描。
需求2:筛选出所有对应VALUE字段均为'W'的相同ID
假设表名为value_table,要找**所有关联该ID的行中,VALUE字段全是'W'**的ID(比如示例ID 534103),可以用以下两种方法:
方式1:GROUP BY + HAVING 排除非'W'的情况
统计每个ID下,VALUE不等于'W'的行数,如果为0,说明所有VALUE都是'W':
SELECT ID FROM value_table GROUP BY ID HAVING COUNT(CASE WHEN VALUE != 'W' THEN 1 END) = 0;
如果要验证示例ID 534103是否符合条件,可以加个过滤:
SELECT ID FROM value_table WHERE ID = 534103 GROUP BY ID HAVING COUNT(CASE WHEN VALUE != 'W' THEN 1 END) = 0;
返回结果为空的话,说明这个ID下存在非'W'的VALUE;返回ID则说明全是'W'。
方式2:利用MIN/MAX特性
因为如果某ID下所有VALUE都是'W',那么它的最小值和最大值必然都是'W':
SELECT ID FROM value_table GROUP BY ID HAVING MIN(VALUE) = 'W' AND MAX(VALUE) = 'W';
这种写法更简洁,适合VALUE字段是固定枚举值的场景。
内容的提问来源于stack exchange,提问作者civesuas_sine
相关产品推荐
相关产品推荐

