【发布时间】:2015-03-06 20:02:13
【问题描述】:
我在 CTE 上尝试了很多东西,但仍然有问题 例如,我有一张这样的桌子:(在我的桌子上我有 6 873 368 行)
+--------+----------+---------+
| 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 |
+--------+----------+---------+
我想一路走 grom 来源:例如 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 谢谢:)
【问题讨论】:
-
什么数据库系统,哪个版本? SQL 只是结构化查询语言 - 许多数据库系统使用的语言 - SQL NOT 数据库产品...这样的东西通常是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统......(请相应地更新标签)
-
对不起,我不准确,我使用的是 sql server 2008
-
CTE一路计算,用这种方式耗时太长,我尝试修改cte中的内连接,但没有结果
-
只看一下查询,最大的性能杀手很可能是您的 join 和 where 子句,尤其是
NOT LIKE不可分割(以%开头),但您可能不会能够摆脱它。 CTE 在大型数据集中确实会受到影响,因此将查询更改为使用带有while循环的索引临时表来执行递归可能不那么漂亮,但可以加快速度。 -
但我不确定我的内部连接语句是否正确或我的 where 子句
标签: sql sql-server-2008 common-table-expression recursive-query