Триггер базы данных, который находит ближайшую запись из другой таблицы после вставки

У меня есть две таблицы (a, b), обе с полем формы или геометрии. Я хочу, чтобы триггер запускался после вставки в таблицу a, чтобы найти (единственную) ближайшую пространственную запись из таблицы b. Я изучил функцию STDistance с небольшой удачей. Таблица а уникальна.

ПОСЛЕ ВСТАВКИ

Таблица а

OBJECTID,RoadID

12345,NULL

Таблица б

AssetID

RD12345

RD12233

RD12333

RD12222

STDistnace сказал бы, что таблица a.OBJECTID 12345 ближайшая таблица b.AssetID = RD12222

Результат

Таблица а

OBJECTID,RoadID

12345,RD12222

Я завершил предварительное тестирование, которое возвращает все совпадающие записи (из обеих таблиц), но я пытаюсь сжать его до только совпадающей записи с наименьшим расстоянием, следовательно, агрегатной функции (MIN) на STDistance.

SELECT TableA.AssetID,MIN(TableA.Shape.STDistance(TableB.Shape)) AS DIST, TableB.AssetID AS RoadID 
FROM TableA, TableB
GROUP BY TableA.AssetID, TableB.AssetID
HAVING MIN(TableA.Shape.STDistance(TableB.Shape)) < 250
ORDER BY AssetID

В результате я получаю отношение многие ко многим по расстоянию для всех записей. Если я применю агрегатную функцию (MIN), я могу значительно уменьшить ее, однако таблица с уникальным идентификатором все еще дублируется. План состоит в том, что после того, как оператор select сработает, я переведу его в свой триггер - я бы предпочел, чтобы ответ основывался на том, как он будет реализован в триггере.


person user52640    schedule 29.07.2019    source источник
comment
Плохие привычки, от которых следует избавиться: использование старых СОЕДИНЕНИЯ стилей — старый стиль разделенного запятыми списка таблиц был заменен на правильный синтаксис ANSI JOIN в ANSI-92 Стандарт SQL (более 25 лет назад), и его использование не рекомендуется   -  person marc_s    schedule 29.07.2019
comment
Спасибо marc_s. ВЫБЕРИТЕ a.assetid,b.Assetid КАК ДОРОГА, b.shape.STDistance(a.shape) КАК РАССТОЯНИЕ ОТ sde.TableA a соединение sde.TableB b на b.shape.STDistance(a.shape) ‹250   -  person user52640    schedule 29.07.2019
comment
Как 12345 ближе всего к таблице b.AssetID = RD12222?   -  person mkRabbani    schedule 29.07.2019
comment
Используя функцию STDistance здесь В обеих таблицах есть поле геометрии.   -  person user52640    schedule 29.07.2019


Ответы (1)


Вы можете использовать CROSS APPLY ... SELECT TOP 1.... ORDER BY distance для перекрестного соединения двух таблиц и выбора ближайшей записи:

SELECT A.OBJECTID, NearestB.B_ID, NearestB.Distance
FROM TableA A
    CROSS APPLY(
        select TOP 1 
            A.Shape.STDistance(B.Shape) AS distance,
            B.AssetID as B_ID
        from TableB B
        order by 1
    ) NearestB

И триггером может быть:

CREATE TRIGGER TableA_Insertion_SetNearestB ON TableA
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO TableA (
        OBJECTID,
        Shape,
        RoadID
    ) SELECT
        INSERTED.OBJECTID,
        INSERTED.Shape,
        NearestB.B_ID
    ) FROM
        INSERTED
        CROSS APPLY(
            select TOP 1 
                INSERTED.Shape.STDistance(B.Shape) AS distance,
                B.AssetID as B_ID
            from TableB B
            order by 1
        ) NearestB
END
GO
person Renat    schedule 29.07.2019