我有一个叫的city
表,一个叫的表routes_
。它们之间的关系是多对多的,所以我map
在它们之间使用了一个表。
routes_
表具有路线的名称
city
表具有城市的坐标。
map
表格包含每个路线的所有城市及其路线顺序:
CREATE TABLE city
(
ID int IDENTITY(1,1) PRIMARY KEY not null ,
name varchar(50) UNIQUE,
populationOfCity int not null,
center char (10) not null,
gover_id int null,
cordinates geography null,
);
CREATE TABLE routes_
(
ID int IDENTITY(1,1) PRIMARY KEY not null,
name varchar (50) not null,
);
CREATE TABLE map
(
ID int IDENTITY(1,1) PRIMARY KEY not null ,
orderOfcity int not null,
city_id int not null,
route_id int not null,
FOREIGN KEY( city_id )REFERENCES city (id),
FOREIGN KEY( route_id )REFERENCES routes_ (id)
);
我需要找到最长的路线。我写这个算法来找到它,但实际上我对于sql server的语法是全新的,所以我需要一些帮助来编写它
stdDistance
。group by
按route_id到地图表,所以我将每条路线的城市分组orederOfcity
以计算距离我开始写这篇文章,但我不知道如何完成循环语法
SELECT map.route_id FROM map group by map.route_id order by MIN(map.orderOfcity)
declare @i int
declare @numOfRows int
set @i=1
set @numOfRows=(SELECT COUNT (*) from map )
while @i<@numOfRows
这是表格的插入语句:插入城市:
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Damascus',3140000,geography::STGeomFromText('POINT(0.0275361 51.5064694)', 4326),'yes');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Alepo',3140000,geography::STGeomFromText('POINT(-66.1711278 -17.4125)', 4326),'Yes');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Hama',725000, geography::STGeomFromText('POINT(036.6666667 35.0833333)', 4326),'yes');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Homs',1033000, geography::STGeomFromText('POINT(036.7500000 34.6666667)', 4326),'yes');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Latakia',554000, geography::STGeomFromText('POINT(035.7500000 35.5000000)', 4326),'yes');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Tartus',393054, geography::STGeomFromText('POINT(035.9166667 34.9166667)', 4326),'yes');
INSERT INTO city (name,populationOfCity,cordinates,center,gover_id)
VALUES ('Al_Bab',20000, geography::STGeomFromText('POINT(037.4833333 36.3833333)', 4326),'No',2);
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Afrin',24000, geography::STGeomFromText('POINT(036.8333333 36.5333333)', 4326),'No');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('As Safirah',14000, geography::STGeomFromText('POINT(037.3500000 36.0833333)', 4326),'No');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Manbij',26000, geography::STGeomFromText('POINT(037.9500000 36.5166667)', 4326),'No');
INSERT INTO city (name,populationOfCity,cordinates,center)
VALUES ('Azaz',34000, geography::STGeomFromText('POINT(037.0666667 36.6000000)', 4326),'No');
插入路线:
INSERT INTO routes_(name) VALUES ('Al_Bab___Afrin');
INSERT INTO routes_(name) VALUES ('As Safirah___Azaz');
INSERT INTO routes_(name) VALUES ('Damascus___Latakia');
INSERT INTO routes_(name) VALUES ('Tartous___Damascus');
插入地图:
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (1,7,1);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (2,9,1);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (3,8,1);
----As Safirah___Azaz
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (1,9,2);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (2,8,2);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (3,10,2);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (4,11,2);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (1,6,4);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (2,4,4);
INSERT INTO map(orderOfcity,city_id,route_id) VALUES (3,6,4);
在我按route_id分组并按bu orderOfCity对其进行排序之后,迭代必须在地图的表格上,因此我知道每条路线的城市,然后我应该计算每组的距离,然后在地图上进行迭代表格,并根据具有相同route_id的城市之间的距离来计算城市之间的距离(如果路线中包含以下示例):1)Al_Bab ___ Afrin 2)由于Safirah___Azaz在地图中的城市为:al bab,作为Safirah,Afrin,地图中的这些城市的路线ID为= 1,我应该计算它们之间的距离,然后移至mab中的下一个route_id为2并对其城市进行相同的计算。
尝试使用JOIN来映射表中的连续行:
SELECT R.Name as RouteName,
SUM(C.cordinates.STDistance(C2.cordinates)) As Distance
FROM routes_ R
INNER JOIN Map M
ON M.route_id = R.Id
INNER JOIN City C
ON M.city_id = C.ID
INNER JOIN Map M2
ON M2.route_id = R.Id AND M2.orderOfcity = M.orderOfcity + 1
INNER JOIN City C2
ON C2.Id = M2.city_id
GROUP BY R.Name
这给出了:
RouteName Distance
--------- --------------------------
Al_Bab___Afrin 103547.016615796
As Safirah___Azaz 247811.559896733
Tartous___Damascus 162303.402745115
要检索最长的路线,请使用:
SELECT TOP 1 R.Name as RouteName,
SUM(C.cordinates.STDistance(C2.cordinates)) As Distance
FROM routes_ R
INNER JOIN Map M
ON M.route_id = R.Id
INNER JOIN City C
ON M.city_id = C.ID
INNER JOIN Map M2
ON M2.route_id = R.Id AND M2.orderOfcity = M.orderOfcity + 1
INNER JOIN City C2
ON C2.Id = M2.city_id
GROUP BY R.Name
ORDER BY SUM(C.cordinates.STDistance(C2.cordinates)) DESC
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句