如何在SQL查询中使用位掩码值实现表连接?
基于位掩码的表连接SQL解决方案
你的原SQL连接条件逻辑错误,导致无法匹配门店覆盖的所有区域。原条件StoreRegion & RegionBitmask = StoreRegion仅当StoreRegion的所有位都被RegionBitmask包含时才成立,但Region表的RegionBitmask都是单个二进制位(1、2、4、8对应二进制的第1到第4位),所以只有当StoreRegion等于某个RegionBitmask时才会匹配,无法覆盖多个区域组合的情况(比如StoreRegion=3是1+2,对应北部+东部)。
正确的SQL语句
SELECT sr.StoreID, sr.StoreCode, sr.StoreRegion, r.RegionBitmask, r.RegionName FROM StoreRegionXRef sr LEFT JOIN Region r ON (sr.StoreRegion & r.RegionBitmask) = r.RegionBitmask ORDER BY sr.StoreID;
预期查询结果
| StoreID | StoreCode | StoreRegion | RegionBitmask | RegionName |
|---|---|---|---|---|
| 1 | 100 | 3 | 1 | 北部 |
| 1 | 100 | 3 | 2 | 东部 |
| 2 | 101 | 1 | 1 | 北部 |
| 3 | 102 | 9 | 1 | 北部 |
| 3 | 102 | 9 | 8 | 西部 |
| 4 | 103 | 8 | 8 | 西部 |
| 5 | 104 | 12 | 4 | 南部 |
| 5 | 104 | 12 | 8 | 西部 |
逻辑说明
位运算&会对两个数的二进制位进行与操作:当RegionBitmask对应的二进制位在StoreRegion中为1时,运算结果等于RegionBitmask本身,以此判断该门店是否覆盖该区域,从而正确关联所有匹配的区域记录。
内容的提问来源于stack exchange,提问作者CopperHead
相关产品推荐
相关产品推荐

