Aracılığıyla paylaş


En yakın komşu için uzamsal verileri sorgulama

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL analiz uç noktasıMicrosoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Uzamsal verilerle kullanılan yaygın bir sorgu, en yakın komşu sorgusudur. Belirli bir uzamsal nesneye en yakın uzamsal nesneleri bulmak için en yakın komşu sorguları kullanılır. Örneğin, bir web sitesinin mağaza bulucusunun genellikle bir müşteri konumuna en yakın mağaza konumlarını bulması gerekir.

En yakın komşu sorgusu çeşitli geçerli sorgu biçimlerinde yazılabilir, ancak en yakın komşu sorgunun uzamsal dizin kullanması için aşağıdaki söz dizimi kullanılmalıdır.

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 ]  
[ ; ]  

En yakın komşu sorgusu ve uzamsal dizinler

SQL Server'da TOP ve ORDER BY yan tümceleri, uzamsal veri sütunlarında en yakın komşu sorgusu gerçekleştirmek için kullanılır. ORDER BY yan tümcesi, uzamsal sütun veri türü için STDistance() yöntemine bir çağrı içerir. TOP yan tümcesi, sorgu için döndürülecek nesne sayısını gösterir.

Uzamsal dizin kullanmak için en yakın komşu sorgu için aşağıdaki gereksinimlerin karşılanması gerekir:

  1. Uzamsal dizin, uzamsal sütunlardan birinde bulunmalıdır ve STDistance() yöntemi, WHERE ve ORDER BY yan tümcelerinde bu sütunu kullanmalıdır.

  2. TOP yan tümcesi bir PERCENT deyim içeremez.

  3. WHERE yan tümcesi bir STDistance() yöntem içermelidir.

  4. Yan tümcesinde WHERE birden çok yüklem varsa, STDistance() yöntemini içeren yüklemin diğer yüklemlerle AND bağlacı aracılığıyla bağlanması gerekir. Yöntem, STDistance() tümcesinin WHERE opsiyonel bir parçasında olamaz.

  5. İlk ifade, ORDER BY cümlesinde STDistance() yöntemini kullanmalıdır.

  6. STDistance() yan tümcesindeki ilk ORDER BY ifadesinin sıralama düzeni ASC olmalıdır.

  7. STDistance NULL döndüren tüm satırlar filtrelenmelidir.

Warning

SRID'ler veri türleri için aynı değilse coğrafya veya geometri veri türlerini argüman olarak alan yöntemler sonucunda NULL döndürülecektir.

Yeni uzamsal dizin tessellasyonlarının, en yakın komşu sorgularda kullanılan dizinler için kullanılması önerilir. Uzamsal dizin mozaikleri hakkında daha fazla bilgi için bkz . Uzamsal Veriler.

Örnek 1

Aşağıdaki kod örneği uzamsal dizin kullanabilen en yakın komşu sorgusunu gösterir. Örnek, örnek veritabanındaki Person.Address tabloyu kullanırAdventureWorks2025.

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);  

En yakın komşu sorgusunun uzamsal dizini nasıl kullandığını görmek için SpatialLocation sütununda bir uzamsal dizin oluşturun. Uzamsal dizinler oluşturma hakkında daha fazla bilgi için bkz. Uzamsal Dizinler Oluşturma, Değiştirme ve Bırakma.

Örnek 2

Aşağıdaki kod örneği uzamsal dizin kullanamayan en yakın komşu sorgusunu gösterir.

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);  

Sorgunun söz dizimi bölümünde belirtilen bir formda kullanan WHERE bir STDistance() yan tümcesi olmadığından sorgu uzamsal dizin kullanamaz.