0

アイテム間の依存関係を保持するジャンクション テーブルがあります。これを使用して、これらの依存関係を示すガント チャートをプログラムで作成しています。現在、ストアド プロシージャは機能していますが、私の会社のポリシーでは、可能な限りカーソルを使用しないようにしています。私はこれを専門家に伝えましたが、カーソルなしでこれを行うことは可能ですか? データ:

declare @BaseTable Table
(
    [IssueDependencyId] [bigint] IDENTITY(1,1) NOT NULL,
    [IssueId] [bigint] NOT NULL,
    [DependsOnIssueId] [bigint] NOT NULL
)

INSERT INTO @BaseTable SELECT 48, 0 UNION ALL SELECT 49, 48 UNION ALL SELECT 50, 48 UNION ALL SELECT 51, 48 UNION ALL SELECT 55, 48 UNION ALL SELECT 56, 48 UNION ALL SELECT 52, 49 UNION ALL SELECT 52, 50 UNION ALL SELECT 52, 51 UNION ALL SELECT 53, 52 UNION ALL SELECT 57, 54 UNION ALL SELECT 54, 55 UNION ALL SELECT 57, 56

SELECT * FROM @BaseTable

ストアド プロシージャ コード:

DECLARE @IssueId int, @DependsOnIssueId int, @StartPoint int, @EndPoint int
SET @StartPoint = 0
SET @EndPoint = 10

DECLARE @ResultsTable TABLE (
IssueId int not null,
DependsOnIssueId int not null,
Start_Point int,
End_Point int
)
Select IssueId, DependsOnIssueId 
 INTO #tmp1 
 FROM IssueDependency 
 WHERE UpperLevelIssueId = 48 
 ORDER BY DependsOnIssueId

 declare MyCursor Cursor for (Select IssueId, DependsOnIssueId from #tmp1);

 OPEN MyCursor

 FETCH NEXT FROM MyCursor 
 INTO @IssueId, @DependsOnIssueId

 WHILE @@FETCH_STATUS = 0
 BEGIN
    --get parent position to set start
    SELECT @StartPoint = ISNULL(End_Point, 0) 
           FROM @ResultsTable WHERE IssueId = @DependsOnIssueId
    SET @EndPoint = @StartPoint + 10

    INSERT INTO @ResultsTable VALUES 
            (@IssueId, @DependsOnIssueId, @StartPoint, @EndPoint)

    FETCH NEXT FROM MyCursor 
    INTO @IssueId, @DependsOnIssueId
 END

 Close MyCursor

 DEALLOCATE MyCursor;

 SELECT IssueId, 
      MAX(start_point) max_start_point, 
      MAX(end_point) max_end_point
 INTO #MaxPoints
 from @ResultsTable
 GROUP BY IssueId

 SELECT r.IssueId,DependsOnIssueId,
       max_start_point start_point,
        max_end_point end_point  
 FROM @ResultsTable  r
 JOIN #MaxPoints m ON m.IssueId = r.IssueId
 ORDER BY r.IssueId

結果データ

IssueId DependsOnIssueId    Start_Point End_Point
--------------------------------------------------------------------
  48           0                0              10
  49           48               10             20
  50           48               10         20
  51           48               10         20
  52           49               20         30
  52           50               20         30
  52           51               20         30
  53           52               30         40
  54           55               20         30
  55           48               10         20
  56           48               10         20
  57           54               30         40
  57           56               30         40

あなたの助けに感謝します!!

4

2 に答える 2

1

私はこれをテストしていません。自動インクリメント列を使用して、temp1 テーブルをループしています。ここに行きます:

DECLARE @tmp1 table 
(
   _ID int identity (1,1) , -- will be used for looping
   IssueId int not null,
   DependsOnIssueId int not null
)

DECLARE @i as int
DECLARE @max as int

INSERT INTO @tmp1 (IssueId, DependsOnIssueId )
Select IssueId, DependsOnIssueId  
FROM IssueDependency 
WHERE UpperLevelIssueId = 48 
ORDER BY DependsOnIssueId

SELECT @i = 1, @max = MAX(_ID) FROM @tmp1

WHILE @i <= @max
BEGIN
SELECT @IssueId = IssueId, @DependsOnIssueId = DependsOnIssueId
FROM @tmp1 WHERE _ID = @i
    --get parent position to set start
   SELECT @StartPoint = ISNULL(End_Point, 0) 
       FROM @ResultsTable WHERE IssueId = @DependsOnIssueId
   SET @EndPoint = @StartPoint + 10

   INSERT INTO @ResultsTable VALUES 
        (@IssueId, @DependsOnIssueId, @StartPoint, @EndPoint)

   SET @i = @i + 1
END
于 2013-07-12T05:33:59.280 に答える