sql 数据存在包含关系的查询
今天收到一个需求,要求接口返回指定套餐的适用范围
例如:全部套餐包,希望适用范围:“中国民族乐器,太极拳,管弦乐器,炫酷舞蹈”
套餐名:全部套餐包
套餐项: 中国民族乐器[ApplyKeyValue] 31204[ApplyKey]
套餐项: 古筝一级[ApplyKeyValue] ; 51288[ApplyKey]
套餐项: 古筝实践 [ApplyKeyValue] 51368[ApplyKey]
套餐项: 太极拳[ApplyKeyValue] 41238[ApplyKey]
套餐项: 管弦乐器,炫酷舞蹈,古筝实践[ApplyKeyValue] 31232,31233,51368[ApplyKey]
适用范围:中国民族乐器 LevelPath:0.2.31204.
适用范围:古筝一级 LevelPath:0.2.31204.51288.
适用范围:古筝实践 LevelPath :0.2.31204.51288.51368.
适用范围:太极拳 LevelPath :0.2.31237.41238.
适用范围:管弦乐器 LevelPath :0.2.31232.
适用范围:炫酷舞蹈 LevelPath :0.2.31233.
思路:
1.0 先从数据库中查询该套餐
2.0 适用范围 根据“逗号” 列转行, 根据逗号拆解
3.0 拆解后去除重复的适用范围
4.0 根据适用范围查询每个ApplyKey的层级LevelPath
5.0 找到每个范围的LevelPath后,过滤子级适用范围,仅保留父级适用范围
难点在于
1. step2 如何根据“逗号”, 将 套餐项:管弦乐器,炫酷舞蹈,古筝实践[ApplyKeyValue] 列=>行
2. step5 如何根据LevelPath 过滤子集适用范围,仅保留父级适用范围
简单说下 难点2的解决方法,难点1网上有相关示例,假设我们已经走到step4,查询的数据结构如下
temp1 temp2
TableID ApplyKey ApplyKeyValue LevelPath TableID ApplyKey ApplyKeyValue LevelPath
1 31204 中国民族乐器 0.2.31204. 1 31204 中国民族乐器 0.2.31204.
2 51288 古筝一级 0.2.31204.51288. 2 51288 古筝一级 0.2.31204.51288.
3 51368 古筝实践 0.2.31204.51288.51368. 3 51368 古筝实践 0.2.31204.51288.51368.
4 41238 太极拳 0.2.31237.41238. 4 41238 太极拳 0.2.31237.41238.
5 31232 管弦乐器 0.2.31232. 5 31232 管弦乐器 0.2.31232.
6 31233 炫酷舞蹈 0.2.31233. 6 31233 炫酷舞蹈 0.2.31233.
step4 得到的数据结构temp1 复制放到临时表temp2中,然后
select temp1.*
from temp1 left outer join temp2 on temp1.Table<>temp2.TableID and temp1. LevelPath LIKE % temp2. LevelPath%
where temp2. is null
结果如下, temp2 中NULL的记录,就是我们要的数据
列=>行
过滤子集元素