数据库表结构
C_ID C_NAME C_PRE_ID I_GRADE I_END I_YESNO I_TIME c_place
01 一号仓库 1 1 1 NULL NULL NULL
0101 1列 1 2 1 0 0 NULL
010101 1层 101 3 0 1 3 1
010102 2层 101 3 0 1 7 1
010103 3层 101 3 0 1 2 1
010104 4层 101 3 0 1 1 1
010105 5层 101 3 0 1 1 1
0102 2列 1 2 1 0 0 NULL
010201 1层 102 3 0 1 1 1
010202 2层 102 3 0 1 1 1
010203 3层 102 3 0 1 1 1
010204 4层 102 3 0 1 1 1
010205 5层 102 3 0 1 0 1现在想通过C_ID的值 如:条件为01 查询出以下结果010101 一号仓库1列1层
010102 一号仓库1列2层
010103 一号仓库1列3层
010104 一号仓库1列4层
010105 一号仓库1列5层
010201 一号仓库2列1层
0100202 一号仓库2列2层
010203 一号仓库2列3层
010204 一号仓库2列4层
010205 一号仓库2列5层
如条件为:0101 查询出以下结果 010101 一号仓库1列1层
010102 一号仓库1列2层
010103 一号仓库1列3层
010104 一号仓库1列4层
010105 一号仓库1列5层
C_ID C_NAME C_PRE_ID I_GRADE I_END I_YESNO I_TIME c_place
01 一号仓库 1 1 1 NULL NULL NULL
0101 1列 1 2 1 0 0 NULL
010101 1层 101 3 0 1 3 1
010102 2层 101 3 0 1 7 1
010103 3层 101 3 0 1 2 1
010104 4层 101 3 0 1 1 1
010105 5层 101 3 0 1 1 1
0102 2列 1 2 1 0 0 NULL
010201 1层 102 3 0 1 1 1
010202 2层 102 3 0 1 1 1
010203 3层 102 3 0 1 1 1
010204 4层 102 3 0 1 1 1
010205 5层 102 3 0 1 0 1现在想通过C_ID的值 如:条件为01 查询出以下结果010101 一号仓库1列1层
010102 一号仓库1列2层
010103 一号仓库1列3层
010104 一号仓库1列4层
010105 一号仓库1列5层
010201 一号仓库2列1层
0100202 一号仓库2列2层
010203 一号仓库2列3层
010204 一号仓库2列4层
010205 一号仓库2列5层
如条件为:0101 查询出以下结果 010101 一号仓库1列1层
010102 一号仓库1列2层
010103 一号仓库1列3层
010104 一号仓库1列4层
010105 一号仓库1列5层
where c_id like '01%'
select * from Table
where c_id like '0101%'
)+(select c_name from DATATable where c_id='0101')+ c_name from DATATable
where c_id like '01%'
and c_id <> '01' and c_id<>'0101'
select c_id,(select c_name from DATATable where c_id='01'
)+(select c_name from DATATable where c_id='0101')+ c_name from DATATable
where c_id like '0101%'
and c_id <> '01' and c_id<>'0101'
1
select c.id,a.name[1,8] || b.name[1,4] ||c.name
from ((test a left join test b
on a.id='01' and b.id[1,2] = a.id and length(b.id)=4 )
left join test c on c.id[1,4] = b.id and length(c.id)=6)2
select c.id,a.name[1,8] || b.name[1,4] ||c.name
from ((test a left join test b
on a.id=b.id[1,2] and b.id[1,2] = a.id and b.id='0101' )
left join test c on c.id[1,4] = b.id and length(c.id)=6)
1
select c.id,a.name[1,8] || b.name[1,4] ||c.name
from ((test a left join test b
on b.id[1,2] = a.id and length(b.id)=4 )
left join test c on c.id[1,4] = b.id and length(c.id)=6)
where a.id='01'
2 select c.id,a.name[1,8] || b.name[1,4] ||c.name
from ((test a left join test b
on a.id=b.id[1,2] and b.id[1,2] = a.id )
left join test c on c.id[1,4] = b.id and length(c.id)=6)
where b.id='0101'
这个结构层数是不固定的.
也就是说
010205 5层 102 3 0 1 0 1 这层下面还可以有数据
c_ID C_name C_pre_ID
01020501 1列 010205
这条数据下还有
c_ID C_name C_pre_ID
0102050101 1层 01020501
如果给出01
得到他下面的所有子集
并显示详细名称,也就是上级名称 + 本身名称
所以结构不能写死
还有就是数据库也是不固定的.
想找个通用的解决方法
sql 应该来说是不能够满足你这么顶的了.
只能从程序入手.
建议:表结构增加个标志父字段(如果不可能增加,那使用你这个数型表的内容也行);
两个递归:先找父再找子
1 找父到你的根的方法
2 找子到无子的方法
方法给你了,余下的总不能让别人帮你干了吧,再帮你干那可太累人了,自己再自摸吧!不满足你的需求,也没有办法了.
要么再看看后来者还有什么好方法.
)+(select c_name from DATATable where c_id='01%' and I_GRADE=2)+ c_name from DATATable
where c_id like '01%' and I_GRADE=3
我这里还需要和其他的表进行关联,其他需要的信息都已经查出来了.
就是不能够按要求获得详细名称.数据库是不可以动的.因为我没有那个权限.
如果是递归的话,当层次很深的化,我想系统应该受不了.
所以还是想在数据库上做点文章
declare @commandWhere2 varchar(4)
declare @C_Warehouse varchar(20)
declare @C_Column varchar(10)
set @commandWhere1 = '01'
set @commandWhere2 = '0101'
set @C_Warehouse = (select C_NAME from DataTable where C_ID = @commandWhere1)
set @C_Column = (select C_NAME from DataTable where C_ID = @commandWhere2)
select @C_Warehouse + @C_Column + C_NAME from DataTable where C_ID like @commandWhere2 +'%'
以上是第二个的第一个很类似,不过就是复杂点,中间需要一些处理,楼主自己想吧。
至于怎么得到" 一号仓库1列n层" 应该很简单的, 用类型转换可以了