我有一个包含3列的SQL表:“从点”,“到点”和“点之间的距离”。特定的一对点始终只有一个距离。
| from | to | distance |
|-----------------------|
| 1 | 2 | 15 |
| 1 | 3 | 20 |
| 1 | 4 | 2 |
| 3 | 2 | 16 |
| 4 | 2 | 48 |
| 5 | 2 | 12 |
| 3 | 4 | 19 |
| 3 | 5 | 55 |
| 4 | 5 | 18 |
现在我有了一个点列表,例如,我想获取这些点之间的距离:
ids = [1, 2, 4]
我想返回这些点之间的所有距离:
1-2 -> 15
1-4 -> 2
2-4 -> 48
我已经在python中编写了一些代码来获取这些配对
pairs=[]
for a in ids:
for b in ids:
if a != b and sorted([a,b]) not in trasy:
pairs.append(sorted([a,b]))
print(sorted([a,b]))
我可以向SQL请求距离,但是这样每对将有一个新的查询,并且ID列表可以更长(例如目前最多50个元素),我不认为这是一个好方法。
我在SQL方面还很新,但是我相信有一些更简单的方法,用一个查询就能很好地解决所有问题
答案 0 :(得分:0)
您可以像这样在单个查询中获取配对:
with points(point_from, point_to, distance) as (
values
(1, 2, 15),
(1, 3, 20),
(1, 4, 2),
(3, 2, 16),
(4, 2, 48),
(5, 2, 12),
(3, 4, 19),
(3, 5, 55),
(4, 1, 68),
(4, 5, 18)
)
select least(point_from, point_to) as "from", greatest(point_from, point_to) as "to", distance
from points
where point_from in (1, 2, 4) and point_to in (1, 2, 4)
from | to | distance
------+----+----------
1 | 2 | 15
1 | 4 | 2
2 | 4 | 48
1 | 4 | 68
(4 rows)
特定点对始终只有一个距离。
嗯,我不这么认为。