我尝试了很多使用CTE的方法,但仍然存在问题。
例如,我有一个表格,像这样:(在我的表格中,有6,873,368行)
我想从源1一直走到目的地4,例如对于某些路线,使用CTE可以完美解决问题,但对于我有的行数太多时,时间会非常长(某些解决方案需要超过29分钟)。
我尝试了这个:
我期望的输出应该像这样:
我只想计算我需要的路线,而不是从所有点到所有点的路线,比如从A到B的路线 :) 如果可能的话,你有什么快速的方法可以建议吗?
我尝试了很多方法,但我不知道如何在达到所需值时停止CTE?
在执行“select * from CTE”语句之前,我已经得到了这个结果:
但我想在CTE期间停止结果传输到dest:4 谢谢 :)
+--------+----------+---------+
| SOURCE | DEST | DISTANCE|
+--------+----------+---------+
| 1 | 1 | 125 |
| 1 | 2 | 100 |
| 1 | 3 | 002 |
| 1 | 4 | 058 |
| 2 | 1 | 000 |
| 2 | 2 | 050 |
| 2 | 3 | 125 |
| 2 | 4 | 785 |
| 3 | 1 | 000 |
| 3 | 2 | 050 |
| 3 | 3 | 125 |
| 3 | 4 | 785 |
+--------+----------+---------+
我想从源1一直走到目的地4,例如对于某些路线,使用CTE可以完美解决问题,但对于我有的行数太多时,时间会非常长(某些解决方案需要超过29分钟)。
我尝试了这个:
;WITH T_Route (CONNECTION_DEST, STEPS, WEIGTH, WAY, RESSOURCE_SRC,RESSOURCE_DEST,RESSOURCE_TYPE)
AS
(SELECT DISTINCT C.CONNECTION_SRC
, 0
, 0
, @SRC
, @SRC
, @SRC
, 1
FROM #CheminCircuit AS C
WHERE C.RESSOURCE_SRC = @SRC
UNION ALL
SELECT arrival.CONNECTION_DEST
, departure.STEPS + 1
, departure.WEIGTH + arrival.VOL
, departure.WAY + ',' + arrival.RESSOURCE_DEST
, departure.RESSOURCE_DEST
, arrival.RESSOURCE_DEST
, arrival.RESSOURCE_TYPE
FROM #CheminCircuit AS arrival
INNER JOIN T_Route AS departure ON departure.CONNECTION_DEST = case when departure.STEPS < @STEPS then arrival.CONNECTION_SRC else 0 end -- AND arrival.RESSOURCE_SRC not like '%' + @DEST + '%' AND departure.STEPS < @STEPS
WHERE departure.WAY NOT LIKE '%,' + arrival.RESSOURCE_DEST + '%'
AND (arrival.RESSOURCE_TYPE NOT IN (SELECT T.[Index] FROM Type_Ressource T WHERE T.[Index] IN (1)) OR arrival.RESSOURCE_DEST IN (@SRC,@DEST))
)
,SHORT (WEIGTH)
AS
(SELECT WEIGTH
FROM T_Route
WHERE RESSOURCE_DEST = @DEST)
SELECT *
FROM T_Route AS T
我期望的输出应该像这样:
+--------+----------+----------------+--------+--------+
| SOURCE | DEST | DISTANCE | TIME |STEPS |
+--------+----------+----------------+--------+--------+
| 1 | 4 | 1->2->3->4 | 285 | 2 |
| 1 | 4 | 1->4 | 183 | 0 |
| 1 | 4 | 1->3->4 | 185 | 1 |
| 1 | 4 | 1->2->4 | 283 | 1 |
+--------+----------+---------+------+--------+--------+
我只想计算我需要的路线,而不是从所有点到所有点的路线,比如从A到B的路线 :) 如果可能的话,你有什么快速的方法可以建议吗?
我尝试了很多方法,但我不知道如何在达到所需值时停止CTE?
在执行“select * from CTE”语句之前,我已经得到了这个结果:
+--------+----------+----------------+--------+--------+
| SOURCE | DEST | DISTANCE | TIME |STEPS |
+--------+----------+----------------+--------+--------+
| 1 | 4 | 1->2->4->3 | 285 | 2 |
| 1 | 4 | 1->4->1 | 183 | 0 |
| 1 | 4 | 1->3->4->2->1 | 185 | 1 |
| 1 | 4 | 1->2->4 | 283 | 1 |
+--------+----------+---------+------+--------+--------+
但我想在CTE期间停止结果传输到dest:4 谢谢 :)