300分求一个select 语句的写法。(300分)

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

chensh

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下一表
会员 年龄 推荐人
a 25 w
b 25 a
c 25 b
d 25 b
f 25 d
=======================================
推荐人都是会员,每个会员可以推荐新会员,要求列出某会员推荐的所有会员以及他推荐会员又推荐的会员,形成树状。
比如:列会员a的推荐会员树,有b,c,d,f,如果c,f又推荐了会员同样要列出,以此类推。请问这个select语句该怎么写?

(我用的是ado 连access 数据库)
 
这个用SQL恐怕无法胜任
要清楚,SQL并不是万能的啊
 
做一个树,把内存流存放在数据库中
读取内存流,解析
 
昏。这个看来光sql是解决不了了。。。
 
sql解决可以通过循环
 
sql只能给你一个结果集。 你可以清楚描述你的结果集。 不要描述成树,这样大家都不好理解。
 
一个树可以用一个二维表表示吗?
 
把查询到的内容放在treeview中就很容易形成树。
 
网中戏说的对,先放在树中,然后对树进行操作
 
用网中戏的做法,把查询结果放到treeview中处理
 
access 比较麻烦
如果是MSSQL的话,有两种方法得到结果
一种是用游标,一种是用临时表。
用Access的话,一句SQL语句应该是没有办法的。
 
这种方法可以解决的,解决的方法就是用存储过程,具体代码很容易写,一个嵌套就可以完成这个功能的,具体代码你应该可以完成的
 
我需要的就是具体代码,请大家帮帮我。
 
这样的SQL应该会存在以下问题:
1.层次的限制,最多多少个递推层次
2.死循环,所以保证数据的准备性

关注!
 
也不是不可能 关键是表的设计
AutoId 自动编号
CName 会员
FatherId 会员父AutoId表识
自动编号为会员的编号,FatherId即是该会员的介绍人ID
procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from tb1');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);

//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;

AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;
给分吧 我没分了
 
你要列出的数据结果集是什么样的?
a - b
a - d
b - c
c - d
d - e
a推荐了b和d, b又推荐了c, d 又推荐了3 , 而d又推荐了d
 
SQL函数:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ShowTree]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[ShowTree]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE FUNCTION ShowTree (@ParentID VARCHAR(10))
RETURNS @Tree TABLE
(
ParentID VARCHAR(10),
ChildID VARCHAR(10)
)
AS
BEGIN
DECLARE @ChildID VARCHAR(10)
DECLARE MyCur CURSOR FOR SELECT ChildID FROM @Tree WHERE ParentID=@ParentID
OPEN MYCUR
INSERT @Tree
SELECT @ParentID AS ParentID, ChildID AS ChildID
FROM Tree
WHERE ParentID=@ParentID
FETCH NExt FROM MyCur INTO @ChildID
WHILE @@FETCH_STATUS= 0
BEGIN
INSERT @Tree SELECT * FROM ShowTree(@ChildID)
FETCH Next FROM MyCur INTO @ChildID
END
CLOSE MyCur
DEALLOCATE MyCur
RETURN
END
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

树结构为:
A(B(E,F,G),C,D(H,I))
执行语句:
select * from ShowTree('A')
结果显示:
ParentID ChildID
A B
A C
A D
B E
B F
B G
D H
D I
列ChildID的数据就是你要的结果。

PS:不知道合不合你的要求
SQLserver对函数好象最多只支持32层的调用,应该够用
对数据必须在输入时控制好,不能有死循环,不然应该有问题(我没测)
 
我定义的表为Tree,结构只有两个字段(ParentID,ChildID),都是varchar(10)
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
896
DelphiTeacher的专栏
D
后退
顶部