如何仅从variant_detail表获取满足variant_setting所有行条件为True的结果?
解决思路与SQL实现
哈哈,忙起来脑子转不动太正常了!这个问题属于典型的「全条件满足」筛选场景,我来帮你一步步搞定。
首先咱们先明确核心需求:只保留variant_detail中,其vad_pd_id对应的variant_setting所有行条件都为True的记录。我先假设variant_setting的结构包含关联字段(比如vs_pd_id,和variant_detail的vad_pd_id对应)以及一个布尔字段(比如is_condition_true)来标记条件是否成立——毕竟你没给出它的结构,咱们基于通用场景来。
方法一:用NOT EXISTS反向排除
这个思路是「排除所有不符合的,剩下的就是符合的」:只要某个pd_id在variant_setting里存在任意一条条件为False的记录,那这个pd_id对应的所有variant_detail都直接排除。
SELECT vd.* FROM variant_detail vd WHERE NOT EXISTS ( SELECT 1 FROM variant_setting vs WHERE vs.vs_pd_id = vd.vad_pd_id AND vs.is_condition_true = FALSE -- 存在任何不满足的条件就排除 );
方法二:分组统计验证全满足
这个思路是先统计每个pd_id的总条件数和满足True的条件数,只有当两者相等时,说明该pd_id的所有条件都是True,再关联回variant_detail获取记录。
SELECT vd.* FROM variant_detail vd INNER JOIN ( SELECT vs_pd_id FROM variant_setting GROUP BY vs_pd_id HAVING COUNT(*) = SUM(CASE WHEN is_condition_true = TRUE THEN 1 ELSE 0 END) -- 总条件数等于满足True的数量 → 所有条件都为True ) valid_pd_ids ON vd.vad_pd_id = valid_pd_ids.vs_pd_id;
补充说明
- 如果你的variant_setting里存在某个pd_id没有任何记录的情况,这两种方法都会自动排除对应的variant_detail。如果需要保留这类记录,可以调整逻辑(比如用LEFT JOIN并处理NULL的情况)。
- 如果variant_setting里同一个pd_id有重复的条件记录,记得在COUNT时用
COUNT(DISTINCT 条件字段)来避免统计重复值影响结果。
内容的提问来源于stack exchange,提问作者volant
相关产品推荐
相关产品推荐

