求SQL语句。(100分)

  • 主题发起人 主题发起人 xuming
  • 开始时间 开始时间
X

xuming

Unregistered / Unconfirmed
GUEST, unregistred user!
数据如下:
Item_ID Item_Parent Item_Name
1 -1 税控加油机
3 1 税控主板
5 1 键盘
7 1 流量计
9 7 流量计外壳
11 7 流量计机芯
13 7 螺丝
15 11 螺丝
17 16 潜油泵
19 18 控制电脑
21 19 计算机主板
23 19 CPU
25 17 电机
27 17 吸油管道
29 23 CPU风扇
其树形结构如下所示:
税控加油机
税控主板
键盘
流量计
流量计外壳
流量计机芯
螺丝
螺丝
潜油泵
电机
吸油管道
控制电脑
计算机主板
CPU
CPU风扇
*******************************
请问:
如何取得税控加油机下所有配件的列表?即:
税控主板
键盘
流量计
流量计外壳
流量计机芯
螺丝1
螺丝2


 
如果是DB2可以用递归查询来完成
 
数据库是:SQL SERVER 2000,有没有办法?
 
用PL/SQL吧.
另:
愚以为:潜油泵,控制电脑的Item_Parent设置为-1(与税控加油机相同)为好...
 
新葵:PL/SQL?好像是ORACLE的东东吧。
潜油泵,控制电脑的Item_Parent是DEMO程序自己写的,我也不知道它为什么要这样写。(Develop Express的DBTREEVIEW),能改吗?
 
你参考一下这个吧, 我手头没有SqlServer没法试验
http://www.pconline.com.cn/pcedu/empolder/db/10203/38921.html
 
如果是sql_server你只好在数据结构上做文章了!
 
创建一个临时表用来保存查询的结果,可以使用一个存储过程来进行查询。当然,也可编程
来进行检索。
 
第归查询,自己再程序中控制。记录数不在增加为止
insert into tmp_table( , , )
value(1,-1,*);
recordcount = 0
while (tmp_table.recordcount >recordcount)// 记录数变大)
begin
insert into tmp_table( , , )
select * from table
where item_parent in (select item_id from tmp_table)
recordcount = tmp_table.recordcount
end;
 
参考:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1457841
 
这样的数据表结构设计只是有利于Develop Express的DBTREEVIEW生成树形结构,而极不利于数据库的查询,
不管SQL语句怎么写都只能复杂而且低效,因此,为方便且提高效率计,须舍弃范式,增加一个多余的列,
此列可称之为辅助ID(Aux_ID),其中须体现ID与父ID及父ID的父ID及……之关系例如Item_ID宽度为5,则
税控加油机的辅助ID为00001,流量计的辅助ID为0000100007,流量计机芯的为000010000700011,依此类推。
这样查询起来就简单多了吧,如Aux_ID like '00001%'即可查出税控加油机下所有配件的列表,
以后要追溯某Item的爷爷甚至九祖都很方便。
辅助ID在Item_ID生成时即可生成(只需parent的Aux_ID + Item_ID,当然宽度要格式化)。
另外,你表中的16和18是什么东西?没爹妈的孩子应该用Item_Parent=-1明确表示,
以免使用中追根溯源的时候出麻烦,-1是上帝,追踪到此为止。

 
唉,自己慢慢想吧,肯定要改结构了。。。。
 
后退
顶部