怎样查找从属关系的所有记录? ( 积分: 100 )

  • 主题发起人 主题发起人 dadada
  • 开始时间 开始时间
D

dadada

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是一张表及部分记录:<br><br>bh1&nbsp;&nbsp;&nbsp;&nbsp;mc1&nbsp;&nbsp;&nbsp;&nbsp;bh2&nbsp;&nbsp;&nbsp;&nbsp;mc2<br>A001&nbsp;&nbsp;&nbsp;张三&nbsp;&nbsp;&nbsp;B001&nbsp;&nbsp;&nbsp;李四<br>B001&nbsp;&nbsp;&nbsp;李四&nbsp;&nbsp;&nbsp;C001&nbsp;&nbsp;&nbsp;王五<br>C001&nbsp;&nbsp;&nbsp;王五&nbsp;&nbsp;&nbsp;D001&nbsp;&nbsp;&nbsp;陈六<br>D001&nbsp;&nbsp;&nbsp;陈六&nbsp;&nbsp;&nbsp;...........<br>....<br>以上省略号表示无限多的记录,并且有上下级关联性<br>有多少下级是未知的<br><br>以上是以“张三”为根的记录,此外还有其他人的<br>现在要求以“A001+张三”为关键字查出他的全部从属记录<br>不知我表述清楚没有?&nbsp;请各位高手支招!<br>急盼~&nbsp;[:(]
 
select&nbsp;*&nbsp;from&nbsp;[TableName]&nbsp;where&nbsp;bh1='A001'&nbsp;and&nbsp;mc1='张三'<br>这样不行么?
 
不行,你这样查出来的只有一条记录...<br>此题需要查出与他有从属关系的所有记录~
 
没明白啥意思。。。。
 
呵呵,如果写这么清楚还不明白,不知道你是怎么学会编程的[:)]<br>我感到无奈,现在的高手们怎么了?<br>还有谁看不懂我的问题?
 
select&nbsp;*&nbsp;from&nbsp;tablename&nbsp;where&nbsp;bh1='A001'&nbsp;and&nbsp;(mc1='张三'&nbsp;or&nbsp;mc2='张三'&nbsp;or&nbsp;bh2=bh1)
 
to:&nbsp;wzquan<br>谢谢!&nbsp;你的语句没有实现预期的结果...请再帮我看看?
 
CREATE&nbsp;FUNCTION&nbsp;f_t(@BH&nbsp;varchar(50))<br>RETURNS&nbsp;@t_Level&nbsp;TABLE(BH&nbsp;varchar(50),Level&nbsp;int)<br>AS<br>BEGIN<br> DECLARE&nbsp;@Level&nbsp;int<br> SET&nbsp;@Level=1<br> INSERT&nbsp;@t_Level&nbsp;SELECT&nbsp;@BH,@Level<br> WHILE&nbsp;@@ROWCOUNT&gt;0<br> BEGIN<br> SET&nbsp;@Level=@Level+1<br> INSERT&nbsp;@t_Level&nbsp;SELECT&nbsp;a.BH2,@Level<br> FROM&nbsp;tb&nbsp;a,@t_Level&nbsp;b<br> WHERE&nbsp;a.BH1=b.BH<br> AND&nbsp;b.Level=@Level-1<br> END<br> RETURN<br>END<br>GO<br><br>SELECT&nbsp;a.bh2,&nbsp;a.mc2<br>FROM&nbsp;tb&nbsp;a,f_t('A001')&nbsp;b<br>WHERE&nbsp;a.BH1=b.BH
 
你可以在存储过程中做两个临时表,一个存结果(和原表格式一样),一个存中间数据(就一个字段)。<br>算法:1,如果查“张三”,将张三插入临时表,insert&nbsp;into&nbsp;tmp&nbsp;values&nbsp;('张三');然后再将‘张三’的数据插入结果表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2,while&nbsp;Exists(select&nbsp;*&nbsp;from&nbsp;tmp)&nbsp;&nbsp;--如果临时表内有数据则循环<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查询临时表中名字的数据,放入结果表;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;插入新的mc2到临时表;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除临时表中旧数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,循环结束后,select&nbsp;*&nbsp;from&nbsp;结果表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,删除结果表,临时表<br><br>不知道你能不能看明白
 
谢谢楼上,我去测试一下
 
感谢:s00000000001&nbsp;你的解决思路新颖独特,处理方式简洁明了,运行效率安全高效,简直太妙了~&nbsp;&nbsp;此问题已按:&nbsp;s00000000001&nbsp;大侠提供的方法完美解决!&nbsp;<br>在此也要感谢帮我解答的各位朋友,你们辛苦了~&nbsp;!
 
多人接受答案了。
 
后退
顶部