SQL实现:主查询返回空结果时检索其他表数据的可行方案
主查询无结果自动切换联表查询的实现方案
该需求纯SQL即可落地,核心逻辑是优先返回首个查询的结果,仅当首个查询返回0行时,才执行联表查询,不需要依赖外部程序做结果判断。
通用兼容实现(适配绝大多数SQL引擎)
利用UNION ALL拼接两段查询,给联表查询加前置判断条件:只有首个查询无结果时,联表部分才会返回数据:
-- 第一部分:直接返回主表查询结果(有结果就直接出) SELECT id, name, surname FROM db.table WHERE id_date = 20201101 UNION ALL -- 第二部分:仅当主表查不到数据时,才执行联表查询 SELECT d.id, d.name, d.surname FROM db.table2 AS d INNER JOIN db.table3 AS g ON d.id = g.id WHERE d.id_date = 20201101 -- 关键判断:主表存在数据时,该条件不成立,联表部分返回空 AND NOT EXISTS ( SELECT 1 FROM db.table WHERE id_date = 20201101 )
实现逻辑说明
- 当主查询命中数据时:
NOT EXISTS条件返回false,第二部分联表查询不会输出任何行,最终结果仅包含主查询的内容 - 当主查询无命中数据时:
NOT EXISTS条件返回true,联表查询正常执行返回结果
注意事项
- 两段查询的返回列数、字段类型、顺序必须完全一致,否则
UNION ALL会执行报错,当前两段查询返回字段均为id、name、surname,符合要求 - 如果主表数据量较大,重复执行两次主表的判断查询会有性能损耗,可以用支持CTE(公共表表达式)的数据库(如PostgreSQL、MySQL 8.0+、SQL Server)做优化,让主查询仅执行一次:
-- 以CTE优化为例,适配PostgreSQL/MySQL 8.0+ WITH main_query AS ( SELECT id, name, surname FROM db.table WHERE id_date = 20201101 ) -- 直接返回主查询结果,若MySQL不支持TABLE语法,替换为 SELECT * FROM main_query TABLE main_query UNION ALL -- 主查询为空时执行联表查询 SELECT d.id, d.name, d.surname FROM db.table2 AS d INNER JOIN db.table3 AS g ON d.id = g.id WHERE d.id_date = 20201101 AND NOT EXISTS (SELECT 1 FROM main_query);
内容的提问来源于stack exchange,提问作者DrGenius
相关产品推荐
相关产品推荐

