You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL Developer无法筛选符合特定条件的行求助

修正后的SQL:获取仅包含指定两个IDENT条件的SubPerimeter

原SQL问题分析

原SQL的NOT EXISTS子句逻辑存在缺陷:通过cri.CRI_KEY != valCri.CRI_KEY关联判断的方式,无法准确排除包含非指定条件的SubPerimeter,反而会错误过滤掉符合要求的记录。

正确实现思路

要精准筛选目标SubPerimeter,需同时满足:

  • 该SubPerimeter的所有criteria均为类型IDENT且值为'00000028'或'0029428A';
  • 两个指定值的criteria都必须存在(避免仅包含其中一个的情况)。

修正后的SQL代码

WITH CRITERIA_SUMMARY AS (
    SELECT 
        sprm.SPRM_KEY,
        COUNT(*) AS total_cri,
        SUM(CASE WHEN cri.CRI_TYPE = 'IDENT' AND cri.CRI_VALUE IN ('00000028', '0029428A') THEN 1 ELSE 0 END) AS valid_cri_count
    FROM S_SUB_PERIMETER sprm
    LEFT JOIN S_CRITERIA cri ON sprm.SPRM_KEY = cri.SPRM_KEY
    GROUP BY sprm.SPRM_KEY
)
SELECT 
    sprm.SPRM_IDENTIFIER,
    sprm.SPRM_KEY
FROM S_SUB_PERIMETER sprm
JOIN CRITERIA_SUMMARY cs ON sprm.SPRM_KEY = cs.SPRM_KEY
-- 验证两个指定值都存在
JOIN S_CRITERIA cri1 ON sprm.SPRM_KEY = cri1.SPRM_KEY AND cri1.CRI_VALUE = '00000028'
JOIN S_CRITERIA cri2 ON sprm.SPRM_KEY = cri2.SPRM_KEY AND cri2.CRI_VALUE = '0029428A'
WHERE 
    cs.total_cri = cs.valid_cri_count  -- 无其他额外条件
    AND cs.valid_cri_count = 2         -- 恰好包含两个指定条件

适配不同数据库的补充方案

如果你的数据库支持集合函数(如PostgreSQL的ARRAY_AGG),可以用更简洁的方式验证值的集合:

WITH CRITERIA_SUMMARY AS (
    SELECT 
        sprm.SPRM_KEY,
        COUNT(*) AS total_cri,
        ARRAY_AGG(DISTINCT cri.CRI_VALUE) AS cri_values
    FROM S_SUB_PERIMETER sprm
    LEFT JOIN S_CRITERIA cri ON sprm.SPRM_KEY = cri.SPRM_KEY
    GROUP BY sprm.SPRM_KEY
)
SELECT 
    sprm.SPRM_IDENTIFIER,
    sprm.SPRM_KEY
FROM S_SUB_PERIMETER sprm
JOIN CRITERIA_SUMMARY cs ON sprm.SPRM_KEY = cs.SPRM_KEY
WHERE 
    cs.total_cri = 2
    AND cs.cri_values = ARRAY['00000028', '0029428A']
    AND EXISTS (SELECT 1 FROM S_CRITERIA cri WHERE cri.SPRM_KEY = sprm.SPRM_KEY AND cri.CRI_TYPE = 'IDENT')

内容的提问来源于stack exchange,提问作者AEL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:17:12