在SQL server
中好的,所以我正在使用一个数据库表,其中行可以有父行,然后可以拥有自己的父行。我需要选择根'row'。我不知道最好的方法。
有一个名为ParentId的字段,它将行链接到具有该ID的行。当ParentId = 0时,它是根行。
这是我现在的查询:
SELECT Releases.Name,WorkLog.WorkLogId
FROM WorkLog,Releases
WHERE
Releases.ReleaseId = WorkLog.ReleaseId
and WorkLogDateTime >= @StartDate
and WorkLogDateTime <= @end
我真的不需要子版本的版本名称,我只想要根版本名称,所以我想选择这样的While循环结果:
WHILE (ParentReleaseId != 0)
BEGIN
@ReleaseId = ParentReleaseId
END
Select Release.Name
where Release.RealeaseId = @ReleaseId
我知道语法很糟糕,但希望我能告诉你我想要实现的目标。
答案 0 :(得分:9)
这是一个可能有用的例子:
此查询获取树的下部元素,并搜索父项的父级。 就像我的表中有4级 - &gt;类别7-> 5,5-> 3,3-> 1.如果我给它5,它会找到1,因为这是三者中的最高级别。
(更改最后一次选择,你可以让所有的父母都在路上。)
DECLARE @ID int
SET @ID = 5;
WITH CTE_Table_1
(
ID,
Name,
ParentID
)
AS(
SELECT
ID,
Name,
ParentID
FROM Table_1
WHERE ID = @ID
UNION ALL
SELECT
T.ID,
T.Name,
T.ParentID
FROM Table_1 T
INNER JOIN CTE_Table_1 ON CTE_Table_1.ParentID = T.ID
)
SELECT * FROM CTE_Table_1 WHERE ParentID = 0
答案 1 :(得分:1)
类似这样的事情
with cte as
(
select id,parent_id from t where t.id=@myStartingValue
union all
select t.id,t.parent_id
from cte
join t on cte.parent_id = t.id where cte.parent_id<>0
)
select *
from cte
join t on cte.id=t.id where cte.parent_id = 0
答案 2 :(得分:0)
使用Andras方法,我编辑了最终选择以直接给我根发布的ID
WITH cte_Releases
(
ReleaseId,
ParentReleaseID
)
AS(
SELECT
ReleaseId,
ParentReleaseID
FROM Releases
Where ReleaseId = 905
UNION ALL
SELECT
R.ReleaseId,
R.ParentReleaseID
FROM Releases R
INNER JOIN cte_Releases ON cte_Releases.ParentReleaseID = R.ReleaseId
)
SELECT max(ReleaseId) as ReleaseId, min(ReleaseId) as RootReleaseId FROM cte_Releases
我现在的问题是我想要遍历所有@ID(该代码中的905)并将每条记录连接到结果