求sql语句 - cAkk(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
又要麻烦数据库高手乐:

一个表有一个字符性字段和一个整数字段,字符型字段内容为:
10000
1000001
1000002
20000
2000003
200001194
2000002
30000
3000001
3000012
30000123
我前面加空格是为了清楚的表明这个字段实际上是一个树型结构.

现在我需要找出根节点所在纪录的整数字段为n的所有的树.

有不明白的请提问(哦自己觉得说的不太明白 :-)
 
我有点不明白:
跟节点有何特征,是不是跟节点都为5个字节长?或者都是以“0”结尾?
只要找出跟节点的特征,问题就好解决了!

如:当跟节点都为5个字节时:
select * from 表 where left(字符型字段,5) ---取字符型字段的前五位数
in (select 字符型字段 from 表 where 整数字段=5)

这方法行吗?
 
1.根节点可以看作5个字节长;
2.只有根节点的相应的整形字段有效,也就是说,如果根节点整形字段为1,
那么她的子节点也全都为1,不管有没有赋值(子节点整数字段没有内容).

>>select 字符型字段 from 表 where 整数字段=5
这个条件就把子节点排除出去乐,不和条件

>>where left(字符型字段,5)
这个条件是不是只能取回根节点?

我需要吧整个树取回来.
 
select * from xtable where a like (select a+‘%’ from xtable where b=n)
a为字符字段,b为整数字段,假定一个n对应一个根节点。
 
cakk,不是你这样理解的:
例如有三个记录: 20000 n
2000003 m
200001194 h

当执行这一句时: select * from 表 where left(字符型字段,5)
三条纪录得出的结果都是:'20000',因为每一纪录的字符型字段
的前五位字节都是“20000”。

再执行: (select 字符型字段 from 表 where 整数字段=5)
得出是:“20000”,所以
上面三条纪录都符合,这样就求出树了,我特意这电脑上通过了,
你试试看。

 
我的例子:table1: zifu zhengshu
20000 5
2000003 8
200001194 9
100003 5
选出跟节点整数为5的树:
select * from table1 where left(zifu,5)
in (select zifu where zhengshu=5)
 
>>select zifu where zhengshu=5)

你的意思理解对了,但关键是上面这句.
子节点的整形字段是没有赋值的,他依靠自己的父节点的整形字段
所以如果select zifu where zhengshu=5那么就把所有子节点排除出去了. :-(
 
哦觉得应该用到union,但是不知道怎么用. :-(
 
也许我对你的问题理解的不清楚,
这句: select zifu where zhengshu=5 它的作用就是求出符合条件的父节点
的字符字段值,即上例的“2000”
上面的例子等价于:
select * from table1 where left(zifu,5)='20000'

因为上面我用了嵌套查询,先算出内层条件select zifu where zhengshu=5
得出'20000'
再算:select * from table1 where left(zifu,5)='20000'
得出三条纪录:

你可把具体的问题mail给我吗:xujiancai@21cn.com
很高兴如果能帮cakk解决问题。
 
这样,哦把哦的具体情况说出来. 上面的字段结构有一点不同,
前面哦为乐描述方便,用乐一个整形字段,其实是一个text型字段.

现在哦需要将 父节点 的text字段包含1234的纪录的相应的"树"全部取出来.
那么哦是不是应该:
select * from table1 where left(字符字段,5)
in (select 字符字段 where 文本字段 like '%1234%')

可是按照这个sql语句,只取出乐父节点.
 
按照你的新的意思,应该是
select * from table1 where left(字符字段,5)
= (select left(字符字段,5) where 文本字段 like '%1234%')
 
select * from table1 where left(字符字段,5)
in (select left(字符字段,5) where 文本字段 like '%1234%')
~~~~~ ~~~

你不会将这弄错吧
 
BTW:
我怎么无法用 Yahoo 的信箱?
it is mean 我无法接收 DFW 的邮件通知。

:((((
 
2 daiqingbo
我写的时候你的还未显示出来。

sorry
 
表名为table,两个字段分别为A1,A2,SQL语句如下:
Select P2.A1,P2.A2 from (Select A1 form table where A2=n) P1,table P2
where P1.A1 like P2.A1%
P1表是个视图,存的是A2=n的所有父节点
P2表就是原来的table,从P1,P2两个表中选出正确的数据,其实思路很简单,呵呵。
估计这个SQL可以进行优化的,我只是简单的写一下。
 
1.我还是不太明白题意...
2.您用什么数据库???left-->我的数据库SQL不支持.
3.您能举例说明吗???
 
>>2.您用什么数据库???left-->我的数据库SQL不支持.
如果不支持left可以试试convert(char(5),字符)
 
>>select * from table1 where left(字符字段,5)
>> in (select 字符字段 where 文本字段 like '%1234%')

我觉得上面的语句没有错啊。是不是子结点前面有空格。
select * from table1 where convert(char(5),ltrim(字符字段))
in (select ltrim(字符字段) where 文本字段 like '%1234%')


 
LWW: 照你的意思,我改写如下:
Select P2.* from (Select 字符字段 form table1 where 文本字段 like '%xxx%') P1,table1 P2
where P1.字符字段 like P2.字符字段%

但是sql explorer抱错:
Line1: Incorrect syntax near 'table1'
 
后退
顶部