Ich habe eine Datenbank voller zweidimensionaler Daten - Punkte auf einer Karte. Jeder Datensatz hat ein Feld des Geometrietyps. Was ich tun muss, ist einen Punkt an eine gespeicherte Prozedur zu übergeben, die die nächsten Punkte zurückgibt (k würde auch an den Sproc übergeben, aber das ist einfach). Ich habe eine Abfrage in Ссылка gefunden, die den nächsten Nachbarn erhält , aber ich kann mir nicht vorstellen, wie ich es erweitern kann, um die nächsten Nachbarn zu finden.
Dies ist die aktuelle Abfrage - T
ist die Tabelle, g
ist das Geometriefeld, @x
ist der zu durchsuchende Punkt, Numbers
ist eine Tabelle mit ganzen Zahlen 1 bis n :
Die innere Abfrage wählt die nächste nicht leere Region aus, und die äußere Abfrage wählt dann das oberste Ergebnis aus dieser Region aus; Die äußere Abfrage kann leicht in (z. B.) SELECT TOP(20)
geändert werden, aber wenn die nächstgelegene Region nur ein Ergebnis enthält, sind Sie damit beschäftigt.
Ich denke, ich muss wahrscheinlich rekursiv nach der ersten Region suchen, die k Datensätze enthält, aber ohne eine Tabellenvariable (was zu Wartungsproblemen führen würde, da Sie die Tabellenstruktur erstellen müssen und dafür anfällig sind) ändern - es gibt viele Felder), ich kann nicht sehen, wie.
Was passiert, wenn Sie TOP (1) WITH TIES
von der inneren Abfrage entfernen und die äußere Abfrage so einstellen, dass die obersten k Zeilen zurückgegeben werden?
Ich wäre auch interessiert zu wissen, ob dieser Änderungsantrag überhaupt hilft. Es sollte effizienter sein als die Verwendung von TOP
:
NB - ungetestet - Ich habe hier keinen Zugriff auf SQL 2008.
Zitiert nach Inside Microsoft® SQL Server® 2008: T-SQL-Programmierung . Abschnitt 14.8.4.
%Vor%Die folgende Abfrage gibt die 10 zurück Punkte von Interesse, die @input am nächsten sind:
Hinweis: Nur ein Teil der WHERE dieser Abfrage Klausel wird von der räumlichen unterstützt Index. Allerdings der Abfrageoptimierer wertet den unterstützten Teil korrekt aus (der "& lt;" - Vergleich) unter Verwendung des Indexes. Dies beschränkt die Anzahl der Zeilen für was der "& gt;=" Teil muss getestet werden, und die Abfrage funktioniert gut. Ändern Der Wert von @start kann manchmal Beschleunigen Sie die Abfrage, wenn es langsamer ist als gewünscht.
Listing 2-1. Hilfstabelle der Zahlen erstellen und auffüllen
%Vor%Tags und Links sql sql-server-2008 geospatial nearest-neighbor