Я стараюсь много вещей с CTE, и у меня все еще есть проблемы У меня есть таблица, которая нравится, например: (В моей таблице есть 6 873 368 строк)SQL Server 2008 CTE Рассчитайте все пути между двумя точками
+--------+----------+---------+
| 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, например для Somes линий он работает отлично с КТР, но с числом строк у меня это заняло слишком много времени (более 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
Th выход я excpeted что-то вроде этого:
+--------+----------+----------------+--------+--------+
| 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 |
+--------+----------+---------+------+--------+--------+
Я просто хочу, чтобы вычислить путь мне нужно не весь путь от всей точки, Жюст путь от А до Б, например :) У вас есть идея, как я могу сделать это за меньшее время, если это возможно?
Я пробовал много вещей, но я понятия не имею, как я могу остановить 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 |
+--------+----------+---------+------+--------+--------+
Но я хотел бы, чтобы остановить результат durring КТР в Dest: 4 Спасибо :)
** Что ** система баз данных и какая версия? ** SQL ** - это только язык структурированных запросов - язык, используемый многими системами баз данных - SQL - это ** НЕ ** продукт базы данных ... такие вещи, как это очень часто зависят от поставщика, - поэтому нам действительно нужно знать, что система базы данных, которую вы используете .... (пожалуйста, обновите теги соответственно) –
Это 'Sql Server' –
Извините, у меня нет точного, я использую sql-сервер 2008 –