Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

विशाल SQL सर्वर डेटाबेस के साथ दूरी की गणना

आप GEOGRAPHY . को देखने से भी बुरा कर सकते हैं डेटाटाइप, उदाहरण के लिए:

CREATE TABLE Places
(
    SeqID       INT IDENTITY(1,1),
    Place       NVARCHAR(20),
    Location    GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
    CROSS JOIN Places p2
GO  
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
        INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO  

geography::Point अक्षांश और देशांतर के साथ-साथ एक SRID (विशेष संदर्भ आईडी संख्या) लेता है। इस मामले में, SRID 4326 है जो मानक अक्षांश और देशांतर है। जैसा कि आपके पास पहले से ही अक्षांश और देशांतर है, आप बस ALTER TABLE भूगोल कॉलम जोड़ने के लिए UPDATE इसे भरने के लिए।

मैंने तालिका से डेटा प्राप्त करने के दो तरीके दिखाए हैं, हालांकि आप इसके साथ एक अनुक्रमित दृश्य नहीं बना सकते हैं (अनुक्रमित दृश्यों में स्वयं-जुड़ना नहीं हो सकता है)। हालाँकि आप एक द्वितीयक तालिका बना सकते हैं जो प्रभावी रूप से एक कैश है, जो कि ऊपर के आधार पर आबाद है। फिर आपको इसे बनाए रखने के बारे में चिंता करने की ज़रूरत है (ट्रिगर या किसी अन्य प्रक्रिया के माध्यम से किया जा सकता है)।

ध्यान दें कि क्रॉस जॉइन आपको 250,000,000,000 पंक्तियाँ देगा, लेकिन खोजना आसान है क्योंकि आपको केवल एक स्थान कॉलम को देखने की आवश्यकता है (यानी, SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100 , दूसरा आपको काफी कम पंक्तियाँ देगा, लेकिन फिर क्वेरी को प्लेस1 और प्लेस2 कॉलम दोनों पर विचार करने की आवश्यकता है)।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. नाम स्थान पर क्रॉस लागू करें, उप-नोड्स डुप्लिकेट रिकॉर्ड लौटाते हैं

  2. SQL सर्वर में संग्रहीत कार्यविधि में पैरामीटर जोड़ने के बीच अंतर?

  3. SQL सर्वर 2008 में hh:mm:ss फॉर्मेट में 24 घंटे से अधिक रिटर्न दें

  4. एसक्यूएल सर्वर परिवर्तनीय कॉलम नाम?

  5. sql:DELETE + INSERT बनाम UPDATE + INSERT