全新名图试驾视频胖哥:一个有挑战性的SQL问题,高分悬赏求解?

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 02:52:11
现有部门表a有三个字段pk(主键)、name(名称)、parentpk
假设表中现有以下数据:
pk name parentpk
1001 test1
1002 test2 1001
1003 test3 1002
1004 test4 1003
1005 test5 1004
问题是怎么用一、二条SQL语句得到pk=1005的所有上级父部门(包括父部门的父部门一至到根)记录,就像这样:
pk=1005的所有父部门列表
pk name parentpk
1001 test1
1002 test2 1001
1003 test3 1002
1004 test4 1003
请各位高手赐教!!!!
不是要取pk=1005以上的前5条记录,是要得到pk=1005的所有父部门(包括父部门的父部门一至到根)的记录,表中数据有可能是这样的
pk name parentpk
1001 test1
1002 test2 1001
1003 test3 1002
1004 test4
1005 test5 1007
1006 test6
1007 test7 1003
那么这时候得到的pk=1005的父部门记录就是
pk name parentpk
1001 test1
1002 test2 1001
1003 test3 1002
1007 test7 1003

Oracle里的树算法,就是这句

select * from 表 start with pk=1005 connect by prior parentpk = pk

.

呵呵,简单一句就解决了

写了个存储过程:
CREATE PROCEDURE AAA(@PK VARCHAR(50))
AS
BEGIN
DECLARE @PARENTPK VARCHAR(50)
DECLARE @EXECSQL VARCHAR(8000)
SET @PARENTPK = (SELECT PARENTPK FROM TABLE1 WHERE PK = @PK)
SET @EXECSQL = ('SELECT * FROM TABLE1 WHERE 1 = 2')
WHILE (ISNULL(@PARENTPK,'') <> '')
BEGIN
SET @EXECSQL = @EXECSQL + (' UNION ALL ') + ('SELECT * FROM TABLE1 WHERE PK IN ('''+@PARENTPK+''')')
SET @PARENTPK = (SELECT PARENTPK FROM TABLE1 WHERE PK = @PARENTPK)
END

EXEC(@EXECSQL)

END

执行如下:
EXEC AAA '1005'

看是否能达到你的要求。

以前写的:

无限级分类存储过程
http://alby.cnblogs.com/archive/2006/05/17/402636.html

不管是你想或取一个结点的所有子类还是一个子类的所有父类,都非常简单

看起来稍微有点复杂,不过实用性很强

仅凭这几个字段是无法得到的..因为你没有关连字段..无法实现两个或多个表的关联

select * from table where parentpk < 1005

这样可以不..我也是刚学SQL..请多指教

这意思是不是要取pk=1005以上的前5条记录啊

select top 5 * from a where pk=1005