Nächsten Nachbarn in räumlichen Daten abfragen

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Instanz von Azure SQLSQL-Analyseendpunkt in Microsoft FabricData Warehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Eine gängige Abfrage, die mit räumlichen Daten verwendet wird, ist die Nächste-Nachbarn-Abfrage. Nächste-Nachbarn-Abfragen werden verwendet, um die nächstgelegenen räumlichen Objekte zu einem bestimmten räumlichen Objekt zu finden. Beispielsweise muss ein Store-Locator für eine Website häufig die nächstgelegenen Filialen zum Standort eines Kunden finden.

Eine Abfrage von nächsten Nachbarn kann in einer Vielzahl von gültigen Abfrageformaten geschrieben werden. Damit jedoch für die Abfrage von nächsten Nachbarn 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ächste Nachbarabfrage und räumliche Indizes

In SQL Server werden die Klauseln TOP und ORDER BY verwendet, um eine Nächste-Nachbarn-Abfrage für räumliche Datenspalten auszuführen. Die ORDER BY-Klausel enthält einen Aufruf der STDistance()-Methode für den Datentyp der räumlichen Spalte. Die TOP-Klausel gibt die für die Abfrage zurückzugebende Anzahl von Objekten an.

Für eine nächste Nachbarabfrage müssen die folgenden Anforderungen erfüllt sein, um einen räumlichen Index zu verwenden:

  1. Ein räumlicher Index muss auf einer der räumlichen Spalten vorhanden sein, und die STDistance()-Methode muss diese Spalte in der WHERE-Klausel 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 ASC festgelegt sein.

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

Warning

Methoden, die die Datentypen 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 Abfragen für Pixelwiederholungen die neuen Mosaiken für räumliche Indizes verwendet werden. Weitere Informationen zu räumlichen Index-Tessellationen finden Sie unter Räumliche Daten.

Beispiel 1

Das folgende Codebeispiel zeigt eine nächste Nachbarabfrage, die einen räumlichen Index verwenden kann. In diesem Beispiel wird die Person.Address-Tabelle der AdventureWorks2025 -Beispieldatenbank verwendet.

Note

In Azure SQL-Datenbank und SQL Database in Microsoft Fabric ist die Anweisung USE nicht verfügbar. Stellen Sie stattdessen eine direkte Verbindung zur gewünschten Datenbank her und führen Sie den Rest des Codebeispiels aus.

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 Abfrage von nächsten Nachbarn einen räumlichen Index verwendet. Weitere Informationen zum Erstellen von räumlichen Indizes finden Sie unter Erstellen, Ändern und Löschen von räumlichen Indizes.

Beispiel 2

Das folgende Codebeispiel zeigt eine nächste Nachbarabfrage, die keinen räumlichen Index verwenden kann.

Note

In Azure SQL-Datenbank und SQL Database in Microsoft Fabric ist die Anweisung USE nicht verfügbar. Stellen Sie stattdessen eine direkte Verbindung zur gewünschten Datenbank her und führen Sie den Rest des Codebeispiels aus.

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.