200分求助一个数据库的查询问题
假设有两个表
一个是单位信息表:DW,程序中对应的是rstDW,
表结构:
ID: integer
PID:integer
dwname:string
另一个是人员信息表:RY,程序中对应的是rstRY
表结构:
ID:integer
DWID:integer (对应DW表中的ID)
...其它字段
现在在程序中左侧有一个TTreeView(TVDW),将单位信息按树型关系加载,其节点的DATA数据为
PDW.ID
PDW.PID
PDW.DWNAME
分别对应相关字段
右侧的TDBGrid显示我所选择的单位的人员信息.现在的问题是:
如果当点击左侧单位信息时,右侧DBGRID的相应查询语句为: 'select * from RY where DWID=' + inttostr(P_DW(TVDW.DATA).ID)
则可以显示对应单位直属的人员信息.
如果我要一并把该选择的单位的下属所有子单位的人员信息显示出来,则要采取别的办法用递归的方法把人员信息挑选出来,这样效率相当低,程序会在一定时间内出现假无响应的情况.
我想请问如何解决这个速度问题.尽量在不修改原有数据库的设计情况下给出解决的办法.
[解决办法]
什么数据库?
[解决办法]
数据库及具体问题????
[解决办法]
修改原表,或转临时表!
[解决办法]
SQL2005及以上版本有现成的递归函数,直接查询出来
把你的2个表连接成这样
t(id,pid,...)
------------
;with cte as(select id from t where id='要查询的单位ID' union all select p.id from cte a join t p on a.id=p.pid) select t.* from cte a join t on a.id=t.id
[解决办法]
treeview data保存单位信息
点击后 取得单位id 然后通过查询获取人员
ps 可以试试devexpress
[解决办法]
我提供一个思路,看可行不!前提条件是DBGrid关联的是DataSource控件,DataSource控件关联ADOQuery控件,(这应该是最常用的关联).
1、首先,加载树结构的同时,把所有的人员信息都查询出来在ADOQuery中。
2、在点击右连树结点的时候,直接过滤ADOQuery中的数据,而不需要重新在数据库中查询。如下:
ADOQuery.Filtered := false;
ADOQuery.Filter := ' ID = ''' + 树结点的值 +''';
ADOQuery.Filtered := true;
说明:如果你的单位编号里有规律,那就更好办 ID like ''' + 树结点 +'%''';就可以。
如果没有规律也不要紧,遍历你所选单位节点下的所有子单位结点,组合一个SQL语句,如:
ID in ('fdsa','fdsa','fdsa') (ADOQuery的过滤不知道支不支持in操作符,没试过)
不过你可以使用or来代替,如(ID = 'fdsa' or id = 'fdsa' or id= 'fdsa'也可以。