问题:
有一张表,包含ID和Parent ID,也就是说,其中一条数据的ID可能会作为另一条数据的Parent ID出现。
现在我想查询出和一个指定ID有联系的所有数据,不管是父节点的兄弟节点,还是它的子节点,或它的子节点的子节点,兄弟节点的子节点,等等。
例如:
table:test
ID Parent ID
1 5
2 1
3 2
4 1
5 -
6 5
7 -
8 4
9 -
10 6
当指定的ID是1,2,3,4,5,6,8,10任意一个的时候,那么这几条数据都应该被查询出来。(因为需要查询出所有有联系的数据,不管是子节点还是父节点还是兄弟节点甚至是延伸出来的数据,都应该被查询出来)
当ID是9的时候就只有一条ID为9的数据。
这个查询能否使用一条SQL语句就实现了呢?这是一个函数来实现的,这个函数可以多次执行SQL以便完善SQL语句,但是最终还是需要仅仅一条SELECT语句能得到一个完整的结果集。
请大家帮帮忙,非常感谢。
(目前我的方法是使用迭代的方法,不断地增加SQL语句中的where子语句以便获取所有数据,但是这个方法有一个限制,SQL语句的长度是有限制的,所以希望大家能想想起他方法)
我的回答:
你的问题1个SQL应该实现不了,不过这样就行了,也很简单,你可以多些数据测测,如果有其他更好的方法可以告诉我
---------------------建立 Temporarily 临时表----------------------------
DECLARE @Temporarily TABLE (Temporarilyid int, TemporarilyPId int)
---------------------申明临时变量a,b,存储你的第一个查询条件,这个固定----------------------------
DECLARE @a int
set @a=(SELECT ID1 as a FROM test WHERE ID1 = 1)
DECLARE @b int
set @b=(SELECT ParentID as b FROM test WHERE ID1 = 1)
---------------------将第一条结果插入临时表----------------------------
INSERT INTO @Temporarily VALUES (@a,@b)
---------------------循环执行,循环数为你记录的条数,这个不固定----------------------------
DECLARE @i int
SET @i = 1
WHILE @i <= 10
BEGIN
---------------------临时变量e,返回表的某条数据是否符合你的子父关联要求----------------------------
DECLARE @e int
set @e=(SELECT distinct Temporarilyid as e FROM @Temporarily WHERE Temporarilyid IN(SELECT ParentID FROM test WHERE ID1 = @i) or TemporarilyPId in(SELECT ID1 FROM test WHERE ID1 = @i))
---------------------符合,执行插入操作----------------------------
IF @e>0
BEGIN
set @a=(SELECT ID1 as c FROM test WHERE ID1 = @i)
set @b=(SELECT ParentID as d FROM test WHERE ID1 = @i)
INSERT INTO @Temporarily VALUES (@a,@b)
END
SET @i = @i + 1
END
---------------------显示结果集----------------------------
SELECT Temporarilyid AS a,TemporarilyPId AS b FROM @Temporarily
觉对可以满足你说的要求,多少条数据都可以,具体说一条sql语句执行,我还没想到可以的