Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-analysslutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
SQL-databas i Microsoft Fabric
En vanlig fråga som används med rumsliga data är den närmaste grannfrågan. Närmsta grannfrågor används för att hitta närmaste rumsliga objekt till ett specifikt rumsligt objekt. Till exempel måste en butikslokaliserare för en webbplats ofta hitta de närmaste butiksplatserna till en kundplats.
En närmaste grannfråga kan skrivas i olika giltiga frågeformat, men för att närmaste grannfråga ska kunna använda ett rumsligt index måste följande syntax användas.
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ärmaste grannfråga och rumsliga index
I SQL Server används TOP
- och ORDER BY
-satser för att utföra en närmaste grannfråga på spatiala datakolumner. Satsen ORDER BY
innehåller ett anrop till metoden STDistance()
för datatypen spatial kolumn. Satsen TOP
anger antalet objekt som ska returneras för frågan.
Följande krav måste uppfyllas för att en närmaste grannfråga ska kunna använda ett rumsligt index:
Ett rumsligt index måste finnas på en av de rumsliga kolumnerna och metoden
STDistance()
måste använda kolumnen i satsernaWHERE
ochORDER BY
.Satsen
TOP
får inte innehålla enPERCENT
-instruktion.Satsen
WHERE
måste innehålla enSTDistance()
-metod.Om det finns flera predikat i
WHERE
-satsen måste predikatet som innehållerSTDistance()
-metoden anslutas med enAND
konjunktion till de andra predikaten. MetodenSTDistance()
kan inte finnas i en valfri del avWHERE
-satsen.Det första uttrycket i
ORDER BY
-satsen måste använda metodenSTDistance()
.Sorteringsordningen för det första
STDistance()
uttrycket iORDER BY
-satsen måste varaASC
.Alla rader som
STDistance
returnerarNULL
måste filtreras bort.
Varning
Metoder som tar geografi eller geometri datatyper som argument returnerar NULL
om SRID:erna inte är samma för typerna.
Vi rekommenderar att de nya spatiala indexindelningarna används för index som används i närmaste grannsökningar. Mer information om spatial index-tessellationer finns i Spatial Data.
Exempel 1
I följande kodexempel visas en närmaste grannfråga som kan använda ett rumsligt index. I exemplet används tabellen Person.Address
i AdventureWorks2022
exempeldatabas.
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);
Skapa ett rumsligt index i kolumnen SpatialLocation för att se hur en närmaste grannfråga använder ett rumsligt index. Mer information om hur du skapar rumsliga index finns i Skapa, ändra och släppa rumsliga index.
Exempel 2
I följande kodexempel visas en närmaste grannfråga som inte kan använda ett rumsligt index.
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);
Frågan saknar en WHERE
-sats som använder STDistance()
i ett formulär som anges i syntaxavsnittet så att frågan inte kan använda ett rumsligt index.