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的记录,就是我们要的数据
在这里插入图片描述
列=>行
在这里插入图片描述
过滤子集元素
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值