9

SQLサーバーの場合

さて、私はデータベーステーブルで作業しています。このテーブルでは、行に親行を含めることができ、その親行に独自の親行を含めることができます。ルートの「行」を選択する必要があります。私はこれを行うための最良の方法を知りません。

そのIDを持つ行に行をリンクするParentIdと呼ばれるフィールドがあります。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

構文がひどいことは知っていますが、うまくいけば、私が達成しようとしていることのアイデアをあなたに提供します。

4

3 に答える 3

9

これが役に立つかもしれない例です:

このクエリは、ツリーの下位要素を取得し、親の親まで検索しています。私のテーブルに4つのレベルがあるように->カテゴリ7->5、5-> 3、3-> 1。5にそれを与えると、これは3つのトップレベルであるため、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
于 2012-08-24T13:20:11.420 に答える
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

そしてフィドル付き:http ://sqlfiddle.com/#!3 / a5fa1 / 1/0

于 2012-08-24T13:23:40.253 に答える
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)を実行し、各レコードを結果に結合したいということです。

于 2012-08-24T14:30:33.530 に答える