2011-11-29 71 views
0

是否有可能没有任何嵌套查询编写的查询为每个城市自COLUMN1找到最接近从列2和显示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 

感谢所有帮助

+1

您的最后结果记录不应该是“EG 10”吗? –

+0

请你能告诉你为什么你需要避免嵌套查询?根据所需逻辑的不同,嵌套查询可以是最简洁最快速的解决方案。 (通过任何方式嵌套查询并不是普遍的错误观点。)另外,您使用的SQL版本是什么? – MatBailie

回答

4

这是对greatest-n-per-group查询的变化。这种类型的查询在堆栈溢出时经常出现。

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和更紧密的城2存在。

+0

虽然你的答案并不严格地涉及嵌套查询,但我必须说我发现嵌套查询的版本在NOT EXISTS * * *中更清晰。 – gpeche

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 

根据你所说的“嵌套查询”什么,这可能会或可能不会被您接受。

但是在任何合理大小的数据集中,我一直保证能找到这个最具有普遍效用的解决方案。

0

这是不是最好的,但将

SELECT LEAST(city1,位于City2)city1, GREATEST(city1,位于City2)城2, 距离 从远处 GROUP BY LEAST(city1,位于City2),GREATEST (city1,city2),距离