Wie kann ich diese SQL-Abfrage erweitern, um die k nächsten Nachbarn zu finden?

9

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 :

%Vor%

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.

    
Smigs 26.03.2010, 11:43
quelle

2 Antworten

2

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 :

%Vor%

NB - ungetestet - Ich habe hier keinen Zugriff auf SQL 2008.

    
Ed Harper 26.03.2010, 12:27
quelle
2

Zitiert nach Inside Microsoft® SQL Server® 2008: T-SQL-Programmierung . Abschnitt 14.8.4.

  

Die folgende Abfrage gibt die 10 zurück   Punkte von Interesse, die @input am nächsten sind:

%Vor%
  

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%     
Henry 24.08.2010 21:38
quelle