如何编写兼容类型列表为空/非空的A、B关联表SQL查询语句
解决方案
纯SQL实现(单语句直接满足两个规则)
以下语句修正了你原有SQL的别名笔误,同时兼容空/非空类型列表的查询逻辑:
SELECT DISTINCT A.* FROM A LEFT JOIN ( SELECT DISTINCT AId FROM B WHERE type IN (SELECT Value FROM @types) ) filtered_b ON A.AId = filtered_b.AId WHERE -- 类型列表为空时,直接返回所有A记录 NOT EXISTS (SELECT 1 FROM @types) -- 类型列表非空时,仅返回关联了符合type的B的A记录 OR filtered_b.AId IS NOT NULL
逻辑说明:
- 先对B表做预筛选,只保留type在传入列表中的AId并去重,避免后续关联产生重复数据
- 用LEFT JOIN关联A表和预筛选的B集合,保证A表的所有记录都能进入后续判断
- WHERE条件做分支判断,自动适配两种查询规则
- 外层DISTINCT用于极端场景下去重,避免返回重复的A记录
C# EF Core 实现(对应你给出的实体类,性能更优)
如果你是用EF Core做数据访问,推荐用动态拼接查询条件的方式,执行效率高于固定单SQL:
// types为传入的type类型列表,参数为List<int> IQueryable<A> query = dbContext.As; if (types.Any()) { query = query.Where(a => a.Blist.Any(b => types.Contains(b.type))); } // 执行查询获取结果 List<A> result = query.ToList();
这种方式在类型列表为空时会直接生成查A表全量的SQL,非空时自动生成带关联判断的查询,没有多余的性能损耗。
内容的提问来源于stack exchange,提问作者SMeG
相关产品推荐
相关产品推荐

