楼主是不是想实现那个treeview树型菜单显示呀?
解决方案 »
- 如何将日期型数据清空为NULL?急
- 如何改变整个数据库内制定名称字段的类型?
- 如何把*.bcp文件导入SQL2000里面呀
- 求救:因为下列 SET 选项的设置不正确: 'ARITHABORT'?
- (在线)请教存储过程编写高手:给出代码马上给分!!!!!
- 急救,请各位高手帮助,分不够可加。
- 请问这样的错误如何挽回?MSSQL2000下
- SQL高手进来看一下!!!
- sos!!! 在SQL Server的脚本里, 如何用OpenDataSource把excel文件import to database?????????? 高分请各位高手Help!!!!!!!!!!!!!!!!!!
- 关于SQL2005的无法登入
- 存储过程中用参数当表明怎么做?
- 防止存储过程并发,如何修改?高手请进,分不够再加。
declare @t table(parid char(3),subid char(3),strNO char(1))
insert into @t
select '001',null,'0' union
select '002','001','0' union
select '003','001','0' union
select '004','001','1' union
select '005','001','1' union
select '006',null,'0' union
select '007','006','0' union
select '008','006','1' union
select '009','001','0' union
select '010','006','1'
select [no]=(select count(distinct isnull(subid,parid)+strNO) from @t where isnull(subid,parid)+strNO<=isnull(a.subid,a.parid)+a.strNO ),a.parid,a.subid,a.strno
from @t a
order by isnull(a.subid,a.parid),a.strNO
/*结果
1 001 NULL 0
1 002 001 0
1 003 001 0
1 009 001 0
2 004 001 1
2 005 001 1
3 006 NULL 0
3 007 006 0
4 008 006 1
4 010 006 1*/
重新调整如下:
其中区别号只有0和1之分。表数据如下
___________________________
| parID | subID |strNO|
---------------------------
| 001 | NULL | 0 |
| 002 | 001 | 0 | 这可以看出,001是002的父ID
| 003 | 001 | 0 | 003的父ID也是001
| 004 | 001 | 1 | 004的父ID也是001只不过区分是1,它与父ID(001)的区分不同,
| 005 | 001 | 1 | 关于区分后面就提到(你看,005的区分与父ID001的区分也不一样)
| 006 | NULL | 0 | 注意:又出现了一个新的父ID(006)
| 007 | 006 | 0 |
| 008 | 006 | 1 |
| 009 | 001 | 0 | <---提个醒:009的父ID可是001哦~
| 010 | 006 | 1 |
| . | . | . |
| . | . | . |
| . | . | . |要求对这个表进行重新分类,得到这样一个结果:先说要求:将所有父ID相同的归为一类,并加个编号,刚才不是提到过“区分”吗(即字段strNO)
对于相同父ID下的子ID,与父ID相同的区分分为一组(这组要包括parID本身这条记录),与父ID不同
的为另外一组,拿上面数据来说:
001是父ID,它的子ID分别是002,003,004,005,009,由于002,003,009的区分与父ID001的区分相同
所以将这三个记录与父ID放在一组,并给个编号为1,剩下的给个编号是2,
再往下看006,这是另一个父ID,它的子ID分别是007,008,010;007的区分与它的父ID006的区分相同
所以将007与006归为一组,给个编号是3,这一组剩下的就给个编号为4 ......
这么依此类推,看一下表结果________________________________
| No | parID | subID |strNO|
--------------------------------
| 1 | 001 | NULL | 0 |
| 1 | 002 | 001 | 0 |
| 1 | 003 | 001 | 0 |
| 1 | 009 | 001 | 0 |
| 2 | 004 | 001 | 1 |
| 2 | 005 | 001 | 1 |
| 3 | 006 | NULL | 0 |
| 3 | 007 | 006 | 0 |
| 4 | 008 | 006 | 1 |
| 4 | 010 | 006 | 1 |
--测试表及数据
declare @t table(subid char(3),parid char(3),strNO char(1))
insert into @t
select '001',null,'0' union
select '002','001','0' union
select '003','001','0' union
select '004','001','1' union
select '005','001','1' union
select '006',null,'0' union
select '007','006','0' union
select '008','006','1' union
select '009','001','0' union
select '010','006','1'
--处理语句
select [no]=(select count(distinct isnull(parid,subid)+strNO) from @t where isnull(parid,subid)+strNO<=isnull(a.parid,a.subid)+a.strNO ),a.subid,a.parid,a.strno
from @t a
order by isnull(a.parid,a.subid),a.strNO
/*结果
no subid parid strno
---------------------------------
1 001 NULL 0
1 002 001 0
1 003 001 0
1 009 001 0
2 004 001 1
2 005 001 1
3 006 NULL 0
3 007 006 0
4 008 006 1
4 010 006 1*/