Я использую SQL Server 2012 У меня есть список дорог, каждый из которых имеет некоторую длину.Например, вот так:
Road Length
A 18
B 40
C 65
Я хочу разделить эти дороги на 20-километровые отрезки.поэтому таблица результатов выглядит следующим образом:
Road From To
A 0 18
B 0 20
B 20 40
C 0 20
C 20 40
C 40 60
C 60 65
Я думаю, мне нужно использовать цикл while, но я не знаю, как создать синтаксис.Только я смог сделать с моими навыками sql такой код:
DECLARE @t1 TABLE
(
Road VARCHAR(10)
,RoadLength INT
)
INSERT INTO @t1 VALUES ('A', 18)
INSERT INTO @t1 VALUES ('B', 40)
INSERT INTO @t1 VALUES ('C', 65)
;
DECLARE @t2 TABLE
(
Road VARCHAR(10)
,SectionFrom INT
,SectionTo INT
)
;
DECLARE @max AS INT
,@a AS INT
SET @max = (SELECT MAX(RoadLength) FROM @t1);
SET @a = 0;
WHILE @a <= @max
BEGIN
INSERT INTO @t2
SELECT Road
,@a
,@a + 20
FROM @t1
SET @a = @a + 20
END
;
DELETE a
FROM @t2 a
join @t1 b ON a.Road = b.Road
WHERE a.SectionFrom >= b.RoadLength
;
UPDATE a SET SectionTo = b.RoadLength
FROM @t2 a
JOIN @t1 b ON a.Road = b.Road
WHERE a.SectionTo > b.RoadLength
;
SELECT *
FROM @t2
ORDER BY Road, SectionFrom
Итак, для каждой дороги вставьте число участков для самой длинной дороги, затем я удалю эти дополнительные участки и обновлю последний раздел, которыйкороче 20 км.Результат удовлетворительный, но, конечно, код ужасный и очень медленный на больших объемах данных.
Есть предложения, как сделать это умнее?Спасибо!