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

如何编写兼容类型列表为空/非空的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:24:01