root/trunk/sql/sqlserver/shortestPath.sql

Revision 18, 1.0 KB (checked in by yabuki, 3 years ago)
Line 
1IF EXISTS (
2  SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'dbo.shortestPath')
3    AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
4DROP PROCEDURE shortestPath
5GO
6
7CREATE PROCEDURE shortestPath AS
8BEGIN
9  DECLARE
10    @maxLength INT,
11    @oldSize INT,
12    @newSize INT
13  SET @maxLength=1
14  SET @oldSize=0
15  SET @newSize=1
16 
17  INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges
18 
19  WHILE @oldSize!=@newSize
20  BEGIN
21    INSERT INTO paths
22      SELECT DISTINCT p.startNode AS startNode,tail AS endNode,@maxLength+1 AS length
23      FROM paths p
24      JOIN edges ON p.endNode=head
25      WHERE p.length=@maxLength
26        AND p.startNode!=tail
27        AND NOT EXISTS (
28          SELECT * FROM paths q
29          WHERE q.startNode=p.startNode AND q.endNode=tail)
30   
31    SET @maxLength=@maxLength+1
32    SET @oldSize=@newSize
33    SET @newSize=(SELECT COUNT(*) FROM paths)
34  END
35END
36GO
37
38TRUNCATE TABLE paths -- こうした方が速い
39GO
40
41EXECUTE shortestPath
Note: See TracBrowser for help on using the browser.