SQL server Abfrage mit "Gleichung"

Ich versuche herauszufinden, wie man eine SQL-Abfrage auf folgende Weise aufbaut:

Ich habe Koordinaten in meiner SQL server-database gespeichert, und ich versuche, alle datasätze in einer bestimmten Entfernung von Punkt zu wählen.

Irgendwelche Ideen, wie man es macht?

SELECT * FROM YourTable INNER JOIN (SELECT (sqrt( ( xDestination - xOrigin)^2 + ( yDestination - yOrigin)^2 )) AS Distance FROM YourTable) AS computed ON YourTable.id = computed.id WHERE computed.Distance = SpecifiedDistance 

Ich weiß nicht, Ihre genauen Definitionen und wie Sie wollen, um die Eingabe der Koordinaten zu behandeln, da ich nicht weiß, ob Sie eine server-Seite Sprache verwenden, um die data eingeben, so ist dies nur ein allgemeines Beispiel

Das ist interessanter, als es auf den ersten Blick schaut, weil man "in einer bestimmten Entfernung" sagt.

Der erste Schnitt einfache Lösung ist die pythagoreische Distanzberechnung, das heißt

 SELECT * FROM myTable WHERE SQRT( (myPositionX - @pointX)^2 + (myPositionY - @pointY)^2 ) = @myDistance 

Allerdings ist ein Floating-Point-Vergleich auf variables nie eine gute Idee wegen der Ungenauigkeiten, und dies ist in diesem Fall wegen der Quadratwurzel – die Sie nicht wirklich brauchen, zusammengesetzt. Es sollte offensichtlich sein, dass, wenn der Abstand von A nach B X ist, dann das Quadrat der Distanz von A nach B auch X quadriert ist. Daher wäre der nächste Schnitt

 SET @mySqrDistance = @myDistance^2 SELECT * FROM myTable WHERE ( (myPositionX - @pointX)^2 + (myPositionY - @pointY)^2 ) = @mySqrDistance 

Nicht nur ist dies genauer wegen der Entfernung der SQRT, es ist auch viel schneller aus dem gleichen Grund (Square Root-functionen, obwohl optimiert, sind langsam). Allerdings hast du immer noch das Problem, Floats zu einem gewissen Grad zu vergleichen (natürlich ist das abhängig von dem Geschmack von SQL und den verwendeten Spaltentypen, aber im Allgemeinen), also könnte ein besserer Ansatz sein

 SET @mySqrDistanceMin = (@myDistance-@myError)^2 SET @mySqrDistanceMax = (@myDistance+@myError)^2 SELECT * FROM myTable WHERE ( (myPositionX - @pointX)^2 + (myPositionY - @pointY)^2 ) BETWEEN @mySqrDistanceMin AND mySqrDistanceMax