如何编写含string_split的SQL查询匹配MCode并输出LegID与CarriCode
修正SQL查询:输出匹配EFTest表MCode的LegID与CarriCode
问题核心
需要从业务表中筛选出拆分后的MCode至少有一个存在于dbo.EFTest表的记录,输出对应的LegID和CarriCode,预期结果为LegID 1(CarriCode AB)、LegID 3(CarriCode AD)。
修正后的SQL查询
假设业务表名为LegCarrier(若实际表名不同,替换为对应名称),字段包含LegID、CarriCode、MCode(逗号分隔的MCode字符串),修正后的查询如下:
SELECT DISTINCT l.LegID, l.CarriCode FROM LegCarrier l CROSS APPLY STRING_SPLIT(l.MCode, ',') AS split_mc JOIN dbo.EFTest e ON TRIM(split_mc.value) = e.MCode
关键逻辑说明
- 拆分MCode字符串:使用
CROSS APPLY STRING_SPLIT()将每条记录中逗号分隔的MCode拆分为独立行,实现逐个校验的需求。 - 处理空格问题:用
TRIM()去除拆分后MCode值的首尾空格,避免因字符串格式问题导致匹配失败。 - 关联匹配校验:将拆分后的MCode与
dbo.EFTest表的MCode做等值关联,筛选出存在匹配的记录。 - 去重处理:通过
DISTINCT确保同一个LegID不会因多个匹配的MCode而重复输出。
原查询常见问题排查
如果原查询未得到正确结果,大概率是以下原因:
- 未使用
CROSS APPLY实现拆分后的行级关联,而是直接用字符串包含判断(如CHARINDEX),可能导致误匹配或漏匹配。 - 未处理拆分后MCode的空格,导致与
EFTest表的MCode无法等值匹配。 - 未添加
DISTINCT,出现重复输出的记录。
内容的提问来源于stack exchange,提问作者Selena
相关产品推荐
相关产品推荐

