Teilen über


Abfragen von nächsten Nachbarn aus räumlichen Daten

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Eine häufig für räumliche Daten verwendete Abfrage ist die Nächster Nachbar-Abfrage. Mithilfe von Nächster Nachbar-Abfragen werden die räumlichen Objekte gesucht, die einem bestimmten räumlichen Objekt am nächsten liegen. Beispielsweise muss von einer Filialsuche auf einer Website häufig die Filiale bestimmt werden, die dem Standort des Kunden am nächsten liegt.

Eine Nächster Nachbar-Abfrage kann in einer Vielzahl von gültigen Abfrageformaten geschrieben werden. Damit jedoch für die Nächster Nachbar-Abfrage ein räumlicher Index verwendet wird, muss die folgende Syntax angegeben werden.

Syntax

SELECT TOP ( number )  
        [ WITH TIES ]  
        [ * | expression ]   
        [, ...]  
    FROM spatial_table_reference, ...   
        [ WITH   
            (   
                [ INDEX ( index_ref ) ]   
                [ , SPATIAL_WINDOW_MAX_CELLS = <value>]   
                [ ,... ]   
            )   
        ]  
    WHERE   
        column_ref.STDistance ( @spatial_ object )   
            {   
                [ IS NOT NULL ] | [ < const ] | [ > const ]   
                | [ <= const ] | [ >= const ] | [ <> const ] ]   
            }  
            [ AND { other_predicate } ]   
    }  
    ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]  
[ ; ]  
  

Nächster Nachbar-Abfrage und räumliche Indizes

In SQL Server werden TOP- und ORDER BY-Klauseln verwendet, um eine Abfrage des nächsten Nachbars für Spalten mit räumlichen Daten auszuführen. Die ORDER BY -Klausel enthält einen Aufruf der STDistance() -Methode für den Typ der Spalte mit räumlichen Daten. Die TOP -Klausel gibt die für die Abfrage zurückzugebende Anzahl von Objekten an.

Die folgenden Anforderungen müssen erfüllt sein, damit eine Nächster Nachbar-Abfrage einen räumlichen Index verwendet:

  1. Ein räumlicher Index muss in einer der räumlichen Spalten vorhanden sein, und die STDistance() -Methode muss diese Spalte in der WHERE - und der ORDER BY -Klausel verwenden.

  2. Die TOP -Klausel darf keine PERCENT -Anweisung enthalten.

  3. Die WHERE -Klausel muss eine STDistance() -Methode enthalten.

  4. Wenn in der WHERE -Klausel mehrere Prädikate vorhanden sind, muss das Prädikat mit der STDistance() -Methode über eine AND -Konjunktion mit den anderen Prädikaten verbunden werden. Die STDistance() -Methode darf sich nicht in einem optionalen Teil der WHERE -Klausel befinden.

  5. Der erste Ausdruck in der ORDER BY -Klausel muss die STDistance() -Methode verwenden.

  6. Die Sortierreihenfolge für den ersten STDistance() -Ausdruck in der ORDER BY -Klausel muss auf ASCfestgelegt sein.

  7. Alle Zeilen, für die STDistance den Wert NULL zurückgibt, müssen herausgefiltert werden.

Warnung

Methoden, die den Datentyp geography oder geometry als Argument annehmen, geben NULL zurück, wenn die SRIDs für die Typen nicht identisch sind.

Es wird empfohlen, dass für Indizes in Nächster Nachbar-Abfragen die neuen Mosaiken für räumliche Indizes verwendet werden. Weitere Informationen zu Mosaiken für räumliche Indizes finden Sie unter Räumliche Daten (SQL Server)festgelegt sein.

Beispiel 1

Im folgenden Codebeispiel wird eine Nächster Nachbar-Abfrage veranschaulicht, die einen räumlichen Index verwenden kann. In diesem Beispiel wird die Person.Address-Tabelle der AdventureWorks2022 -Beispieldatenbank verwendet.

USE AdventureWorks2022  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);  

Erstellen Sie einen räumlichen Index in der SpatialLocation-Spalte, um zu veranschaulichen, wie eine Nächster Nachbar-Abfrage einen räumlichen Index verwendet. Weitere Informationen zum Erstellen von räumlichen Indizes finden Sie unter Create, Modify, and Drop Spatial Indexes.

Beispiel 2

Im folgenden Codebeispiel wird eine Nächster Nachbar-Abfrage veranschaulicht, die keine räumlichen Indizes verwenden kann.

USE AdventureWorks2022  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
ORDER BY SpatialLocation.STDistance(@g);  

In der Abfrage fehlt eine WHERE -Klausel, die STDistance() in einem im Syntaxabschnitt angegebenen Format verwendet, sodass die Abfrage keine räumlichen Indizes verwenden kann.

Weitere Informationen

Räumliche Daten (SQL Server)