SQL Server中WHERE子句如何对比列值?Document前缀匹配过滤问题
原语句问题分析
- 过滤A表时仅筛选了
Client = 'AAA' AND Code = 1,直接遗漏了要求中「Client为'AAA'且Code等于1或2」里Code=2的行 - 采用左连接拼接关联行的逻辑,若单条A表记录匹配多条B表记录会生成重复行,且无法单独返回符合条件的独立行
- 匹配池仅覆盖了AAA且Code=1的Document值,没有把所有Client为AAA的行的Document都作为匹配依据,会漏掉匹配其他AAA行Document的记录
正确查询语句
需求本质是匹配两类独立的行,直接拆分两类规则查询后合并即可,逻辑清晰无重复:
-- 第一类:Client为AAA且Code为1/2的行 SELECT Client, Code, Document FROM MyTable WHERE Client = 'AAA' AND Code IN (1,2) UNION ALL -- 第二类:其余行中Document前三位匹配任意AAA行Document值的行 SELECT Client, Code, Document FROM MyTable WHERE Client <> 'AAA' AND LEFT(Document,3) IN ( SELECT Document FROM MyTable WHERE Client = 'AAA' )
逻辑验证
代入你提供的示例数据运行:
- 第一类查询返回行:
AAA 1 001 - 第二类查询中,仅
001-01的Document前三位001存在于AAA行的Document集合(001、002)中,返回行:001-01 2 001A
最终结果和你给出的预期完全一致。
如果要兼容同一条行同时满足两类规则的极端场景,把UNION ALL改为UNION自动去重即可。
内容的提问来源于stack exchange,提问作者Conner
相关产品推荐
相关产品推荐

