Oracle 11g中如何筛选同时包含两个指定KEY值的账户?
正确查询方法解析
你的原查询逻辑存在问题:同一行数据中的key字段不可能同时等于两个不同的值,所以返回0条结果是符合逻辑的。你需要找的是同一个cta账户对应的多条记录中,同时包含1133-1-1和7095-1-1这两个key值,以下是几种适用于Oracle 11g的可行方案:
方案一:GROUP BY + HAVING 聚合查询
通过分组统计每个cta包含的目标key数量,筛选出同时拥有两个目标值的账户:
SELECT cta FROM cargos WHERE key IN ('1133-1-1', '7095-1-1') GROUP BY cta HAVING COUNT(DISTINCT key) = 2;
- 使用
DISTINCT是为了避免同一cta存在重复的相同key值时干扰统计结果,确保两个key都真实存在。
方案二:自连接查询
将表与自身连接,匹配同一cta下分别对应两个目标key的记录:
SELECT DISTINCT c1.cta FROM cargos c1 JOIN cargos c2 ON c1.cta = c2.cta WHERE c1.key = '1133-1-1' AND c2.key = '7095-1-1';
DISTINCT用于去除查询结果中重复的cta值。
方案三:EXISTS 子查询
通过两次子查询验证同一cta是否同时存在两个目标key的记录:
SELECT DISTINCT cta FROM cargos c WHERE EXISTS ( SELECT 1 FROM cargos WHERE cta = c.cta AND key = '1133-1-1' ) AND EXISTS ( SELECT 1 FROM cargos WHERE cta = c.cta AND key = '7095-1-1' );
这种方式逻辑直观,适合理解基础查询逻辑的场景。
内容的提问来源于stack exchange,提问作者mohamed
相关产品推荐
相关产品推荐

