帮忙写一条SQL语句

GritH2O 2008-07-15 10:52:02
数据库表结构
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层
...全文
191 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
我还没表达清楚
这个结构层数是不固定的.
也就是说
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
得到他下面的所有子集
并显示详细名称,也就是上级名称 + 本身名称
所以结构不能写死
还有就是数据库也是不固定的.
想找个通用的解决方法
lonelygames 2008-07-15
  • 打赏
  • 举报
回复
发现BUG,这样写好
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'
lonelygames 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hzfujiomo 的回复:]
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 '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'
[/Quote]
共同学习共同进步
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)
lonelygames 2008-07-15
  • 打赏
  • 举报
回复
有挑战性,我喜欢!01的结果已出来了,再等等,0101 的就要出来了!
hzfujiomo 2008-07-15
  • 打赏
  • 举报
回复
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 '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'
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
能说说怎么组合吗?
zryStar 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hzfujiomo 的回复:]
select * from Table
where c_id like '01%'


select * from Table
where c_id like '0101%'
[/Quote]
选出来单个字段的值,然后把值相组合,能得到你想的
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
你看没看明白啊
你选出来是什么啊
你选出来是原来的名
我需要的的具体的名字
还全给你,就这个我1分都给你
hzfujiomo 2008-07-15
  • 打赏
  • 举报
回复
把分全给我
hzfujiomo 2008-07-15
  • 打赏
  • 举报
回复
select * from Table
where c_id like '01%'


select * from Table
where c_id like '0101%'
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
每人知道吗?
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
自己顶
gts2pro 2008-07-15
  • 打赏
  • 举报
回复
这么多逻辑条件,还是在存储里实现吧。
RichardSzwz 2008-07-15
  • 打赏
  • 举报
回复
帮你顶.
啃代码 2008-07-15
  • 打赏
  • 举报
回复
like 不能用在 int 类型的字段吧. LZ 可以尝试用除法: c_ID/传染参数与 数 1 来判断是否满足条件
至于怎么得到" 一号仓库1列n层" 应该很简单的, 用类型转换可以了
BlueAnn 2008-07-15
  • 打赏
  • 举报
回复
现在好像,很多逻辑都在数据层解决了,呵呵!!!
BlueAnn 2008-07-15
  • 打赏
  • 举报
回复
up
xz_lm_fly 2008-07-15
  • 打赏
  • 举报
回复
declare @commandWhere1 varchar(2)
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 +'%'
以上是第二个的

第一个很类似,不过就是复杂点,中间需要一些处理,楼主自己想吧。
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
你说的方法我也想过,其实这个sql语句不仅仅是我写出来的这么简单.
我这里还需要和其他的表进行关联,其他需要的信息都已经查出来了.
就是不能够按要求获得详细名称.数据库是不可以动的.因为我没有那个权限.
如果是递归的话,当层次很深的化,我想系统应该受不了.
所以还是想在数据库上做点文章
GritH2O 2008-07-15
  • 打赏
  • 举报
回复
楼上的如果我有100层,是不是要写100个加号呢?
加载更多回复(3)

110,021

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧