मैं निश्चित रूप से सर्वर पर ऐसा करने का प्रयास करता हूं - केवल एक नंबर (अंत में) की गणना करने के लिए 400'000 पंक्तियों को खींचने से बचने का प्रयास करें।
इसके अलावा: मैं इसे बिना किसी कर्सर के बिना करने की कोशिश करता हूं, यदि कभी भी संभव हो। कर्सर एसक्यूएल सर्वर पर एक दुःस्वप्न हैं - उन्हें हर कीमत से बचा जाना चाहिए।
आपके मामले में - अपनी विस्तृत तालिका संरचना को नहीं जानते - आप निश्चित रूप से ऐसा कर सकते हैं उदा। एक पुनरावर्ती सीटीई (सामान्य तालिका अभिव्यक्ति) जो पहले तत्व और 0.0 की कुल दूरी से शुरू होती है, और उसके बाद बिंदु (x + 1) और बिंदु x के बीच की दूरी की गणना करने, और संक्षेप में सभी अन्य बिंदुओं को जोड़ती है, और संक्षेप में पिछले कुल
अंत में, आपके पास एक सीटीई होना चाहिए जो सभी तरह के बिंदुओं को दिखाता है, किसी भी दो मार्गों के बीच की दूरी, और पूरी यात्रा की कुल दूरी।
CTE की तरह कुछ होगा कि:
;WITH Waypoints AS
(
-- anchor your query
SELECT
WaypointID, PrevWaypointID, Long, Lat, 0.0 as Distance, 0.0 as SumOfDistance
FROM
dbo.Waypoint
WHERE
PrevWaypointID IS NULL -- or some other condition
UNION -- recurse
SELECT
WaypointID, Long, Lat,
dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID), -- distance
pts.SumOfDistance + dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID) -- sum
FROM
dbo.Waypoint wp
INNER JOIN
Waypoints pts ON wp.PrevWaypointID = pts.WaypointID
WHERE
(some condition; ID = 1 or PreviousWaypointID IS NULL or something)
)
SELECT * FROM Waypoints
स्रोत
2011-01-27 14:20:44
सबसे तेज़ यह ** ** सर्वर पर गणना करना होगा, लेकिन ** बिना किसी कर्सर ** ..... –
@marc_s: क्या कर्सर के बिना प्रत्येक पंक्ति के लिए दूरी जोड़ने का कोई तरीका है? – mabstrei
मेरी प्रतिक्रिया देखें - आप हमें बहुत सारे विवरण नहीं दे रहे हैं, इसलिए मैं केवल एक बहुत ही सामान्य विचार प्रदान कर सकता हूं .... –