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

如何将多个关联的存在性查询合并为单条SQL查询?

合并分步SQL查询:验证存在type=A时是否有type=B/C的产品

问题背景

需要对cars表执行逻辑合并的查询:先确认是否存在product='car'且type='A'的记录,若存在,则进一步检查是否存在product='car'且type为B或C的记录,要求将这两步逻辑合并为单条SQL语句。

表结构及测试数据:

id;product;type
0;car;A
1;car;B
2;car;C

原分步执行的SQL:
第一步(检查是否有type=A的car):

SELECT 1 FROM cars where product = 'car' and type = 'A';

若第一步返回结果,执行第二步(检查是否有type=B/C的car):

SELECT 1 FROM cars where product = 'car' AND (type = 'B' OR type = 'C');

解决方案1:嵌套EXISTS实现逻辑判断

贴合原分步逻辑,且查询效率较高(EXISTS找到匹配记录后会立即停止扫描):

SELECT 
  CASE 
    -- 先判断是否存在type=A的car
    WHEN EXISTS(SELECT 1 FROM cars WHERE product='car' AND type='A') THEN
      -- 若存在,再判断是否存在type=B/C的car
      CASE WHEN EXISTS(SELECT 1 FROM cars WHERE product='car' AND type IN ('B','C')) THEN 1 ELSE 0 END
    -- 若不存在type=A的car,直接返回0
    ELSE 0
  END AS meets_requirement;
  • 返回1:存在type=A的car,且同时存在type=B/C的car
  • 返回0:要么不存在type=A的car,要么存在type=A但没有type=B/C的car

解决方案2:聚合函数一次性统计状态

可同时输出两个条件的满足情况,方便后续扩展:

SELECT 
  -- 标记是否存在type=A的car
  MAX(CASE WHEN type='A' THEN 1 ELSE 0 END) AS has_type_a,
  -- 标记是否存在type=B/C的car
  MAX(CASE WHEN type IN ('B','C') THEN 1 ELSE 0 END) AS has_type_bc
FROM cars
WHERE product='car';

如果只需要最终判断结果,可调整为:

SELECT 
  CASE 
    WHEN MAX(CASE WHEN type='A' THEN 1 ELSE 0 END) = 1 
         AND MAX(CASE WHEN type IN ('B','C') THEN 1 ELSE 0 END) = 1 
    THEN 1 ELSE 0 END AS meets_requirement
FROM cars
WHERE product='car';

测试结果

针对提供的测试数据,上述两种查询都会返回1,因为同时满足"存在type=A的car"和"存在type=B/C的car"两个条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:23