一个查询来计算距离没有嵌套查询

时间:2011-11-29 21:43:03

标签: sql greatest-n-per-group

是否可以在没有任何嵌套查询的情况下为列表1中的每个城市编写查询,找到距离column2最近的城市并显示City1,City2和距离

    Table:
City1, City2, Distance

例如

City1, city2, Distance
A B 10
A C 20
A D 30
E F 40
E G 10

re result should be:

A B 10
E G 40

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

这是greatest-n-per-group查询的变体。 Stack Overflow上经常出现这种类型的查询。

SELECT c1.City1, c1.City2, c1.Distance
FROM Cities AS c1
LEFT OUTER JOIN Cities AS c2
  ON c1.City1 = c2.City1 AND c1.Distance > c2.Distance
WHERE c2.City1 IS NULL;

换句话说,从行c1中找到城市对,这样就没有其他城市对c2存在相同的City1和更近的City2。

答案 1 :(得分:0)

如果您有权访问ROW_NUMBER()和公用表表达式(例如Oracle10g和SQL Server 2005等)......

WITH
  ordered_results AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY City1 ORDER BY Distance, City2) AS rank,
    City1,
    City2,
    Distance
  FROM
    Cities
)
SELECT
  City1,
  City2,
  Distance
FROM
  ordered_results
WHERE
  rank = 1

根据“嵌套查询”的含义,您可能会接受或不接受。

但是,在任何合理大小的数据集中,我几乎都能保证找到最通用的解决方案。

答案 2 :(得分:0)

这不是最好的,但会

SELECT LEAST(city1,city2)city1,          GREATEST(city1,city2)city2,          距离     距离 GROUP BY LEAST(city1,city2),GREATEST(city1,city2),距离