Oracle SQL多条件同ID查询问题:如何筛选指定条件的同ID数据
修正后的Oracle SQL查询方案
你的需求是筛选出同一ID下同时存在三种属性记录的所有相关数据:该ID需至少有一条VALUE_NO='6000'的记录、至少一条VALUE_TEXT='TEMPERED'的记录,以及至少一条VALUE_TEXT='BLUE'的记录。原SQL用OR只能返回满足任一条件的单条记录,无法关联ID的多属性匹配,以下是两种可行的修正方案:
方案一:分组筛选ID后关联原表
先通过分组聚合找出符合条件的ID,再关联原表返回这些ID的所有记录:
SELECT t.* FROM ATTRIBUTE_TAB t INNER JOIN ( SELECT ID FROM ATTRIBUTE_TAB WHERE (VALUE_NO = '6000') OR (VALUE_TEXT IN ('TEMPERED', 'BLUE')) GROUP BY ID HAVING -- 确保该ID存在VALUE_NO='6000'的记录 COUNT(CASE WHEN VALUE_NO = '6000' THEN 1 END) >= 1 -- 确保该ID存在VALUE_TEXT='TEMPERED'的记录 AND COUNT(CASE WHEN VALUE_TEXT = 'TEMPERED' THEN 1 END) >= 1 -- 确保该ID存在VALUE_TEXT='BLUE'的记录 AND COUNT(CASE WHEN VALUE_TEXT = 'BLUE' THEN 1 END) >= 1 ) valid_ids ON t.ID = valid_ids.ID;
方案二:使用EXISTS子查询直接验证
通过三次存在性检查,确保当前ID同时满足三个属性条件,逻辑更直观:
SELECT * FROM ATTRIBUTE_TAB t WHERE EXISTS (SELECT 1 FROM ATTRIBUTE_TAB WHERE ID = t.ID AND VALUE_NO = '6000') AND EXISTS (SELECT 1 FROM ATTRIBUTE_TAB WHERE ID = t.ID AND VALUE_TEXT = 'TEMPERED') AND EXISTS (SELECT 1 FROM ATTRIBUTE_TAB WHERE ID = t.ID AND VALUE_TEXT = 'BLUE');
说明
- 两种方案都能精准筛选出符合要求的ID对应的所有记录,可根据你的数据量和性能需求选择:数据量较大时,方案一的分组聚合可能更高效;方案二更易理解和维护。
- 若你只需要符合条件的ID列表,可直接取子查询中的
ID字段即可。
内容的提问来源于stack exchange,提问作者Gokhan
相关产品推荐
相关产品推荐

