以前没有遇到过这种情况,要做的时候有点懵。 望老哥指点,多谢!
有这样一个需求,一个表单主表,一个扩展列表,查询的时候要把扩展列表中的多行转成主表多列。
比如
dt_zhubiao
id | type | title |
1 | 1 | 表单1-1 |
2 | 1 | 表单1-2 |
3 | 2 | 表单2-1 |
4 | 2 | 表单2-2 |
dt_kuozhanbiao
id | formid | name | title | value |
1 | 1 | ext_a | 工龄 | 18 |
2 | 1 | ext_b | 职称 | 副级 |
3 | 2 | ext_a | 工龄 | 20 |
4 | 2 | ext_b | 职称 | 正级 |
5 | 3 | ext_2a | 字段1 | 值1 |
6 | 3 | ext_2b | 字段2 | 值2 |
7 | 3 | ext_2c | 字段3 | 值3 |
8 | 4 | ext_2a | 字段1 | 值21 |
9 | 4 | ext_2b | 字段2 | 值22 |
10 | 4 | ext_2c | 字段3 | 值23 |
查询时,会根据dt_zhubiao表的type来查询,type字段一样时,dt_kuozhanbiao表条数和name都会一致,value不一致。
想要的结果如下:
查询type=1时,select * from dt_zhubiao where type = 1 ...
id | type | title | ext_a | ext_b |
1 | 1 | 表单1-1 | 18 | 副级 |
2 | 1 | 表单1-2 | 20 | 正级 |
查询type=2时,select * from dt_zhubiao where type =2 ...
id | type | title | ext_2a | ext_2b | ext_2c |
3 | 2 | 表单2-1 | 值1 | 值2 | 值3 |
4 | 2 | 表单2-2 | 值21 | 值22 | 值23 |
那么问题来了,基于 select * from dt_zhubiao where type = ? 基础sql语句,如何生成这种查询结果 ?
之前试过join、union都没有实现出来,困扰许久,望老哥解惑!
这个只能有游标拼接动态SQL去执行吧。
嗯嗯 , 已解决了。
建议别写sql了,把数据查出来后再拼接
– 会长 5年前@会长: 去程序拼接的话是麻烦一点, 所以就想看看SQL能不能直接实现的。
– 尾随前行 5年前@尾随前行: 比写sql简单,我觉得这sql没法写
– 会长 5年前@尾随前行: 也许可以写,但是绝对比代码里拼接难很多,如果代码拼接难度是1,写sql难度是50
– 会长 5年前@会长: 如果可以用SQL实现, 和写代码比较起来,哪种效率会高些? 比如当主表数据达到一定量级时实现分页条件查询 。。。
– 尾随前行 5年前@尾随前行: 得实验 才知道,说不好
– 会长 5年前@会长: 嗯, 我现在是生成了 select a.*,(select value from dt_kuozhanbiao where formid =a.id and name = 'ext_a') as 'ext_a' from dt_zhubiao a 这种SQL语句去了 -:)
– 尾随前行 5年前@尾随前行: 这样感觉不好弄啊,因为列数不固定,你这样等于写死了列了
– 会长 5年前@会长: 已经解决了 -:)
– 尾随前行 5年前@尾随前行: niubi
– 会长 5年前