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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:12:49