2011-11-29 114 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),距離