如何不使用动态SQL 按输入参数选择使用inner join或outer join
实现方案
完全可以不依赖动态SQL实现该需求,核心逻辑是统一使用左外连接,再通过WHERE条件的参数判断模拟INNER JOIN的过滤效果。
核心逻辑
- 关联查询固定使用LEFT OUTER JOIN(左外连接),保证参数为空时可以返回主表全部记录
- 在WHERE子句中新增判断规则:若过滤参数不为空,则要求关联表的非空关联键(如主键)不为空,等价于过滤掉左连接中关联表无匹配的行,实现和INNER JOIN完全一致的效果
代码示例
以主表orders(订单表)、关联表users(用户表)、过滤参数为@user_name为例,参考SQL如下:
SELECT o.*, u.* FROM orders o -- 固定使用左外连接 LEFT OUTER JOIN users u ON o.user_id = u.id WHERE -- 分支1:参数为空时,不对关联表匹配做限制 (@user_name IS NULL -- 分支2:参数不为空时,要求同时满足过滤条件、关联表有匹配 OR (u.name = @user_name AND u.id IS NOT NULL))
效果验证
- 传入参数
@user_name = '张三':仅返回下单用户为张三的订单,无匹配时返回0条,和INNER JOIN效果完全一致 - 不传入参数(
@user_name为NULL):返回所有订单,关联到对应用户的记录带用户信息,未关联到的记录用户字段为NULL,和LEFT JOIN效果完全一致
注意事项
- 用来判断关联表是否匹配的字段必须是非空字段(如主键、带非空约束的字段),不能使用允许为NULL的字段,否则会出现误判
- 若存在多表关联、多个参数分别控制的场景,每个关联表都按照上述规则添加对应的WHERE判断即可
内容的提问来源于stack exchange,提问作者Osy
相关产品推荐
相关产品推荐

