如何将多个关联的存在性查询合并为单条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
相关产品推荐
相关产品推荐

