【问题标题】:Database Trigger that finds nearest record from another table after insert插入后从另一个表中查找最近记录的数据库触发器
【发布时间】:2019-07-29 15:21:20
【问题描述】:

我有两个表(a,b),都有一个形状或几何字段。我希望在表 a 上插入后运行触发器以从表 b 中找到(单个)最近的空间记录。我调查了 STDistance 函数,但运气不佳。表 a 是唯一的。

插入后

表一

OBJECTID,RoadID

12345,NULL

表 b

AssetID

RD12345

RD12233

RD12333

RD12222

STDistnace 会说 Table a.OBJECTID 12345 最接近 Table b.AssetID = RD12222

结果

表一

OBJECTID,RoadID

12345,RD12222

我已经完成了一些初步测试,它返回了所有匹配的记录(来自两个表),但我试图将其压缩为仅具有最短距离的匹配记录,因此是 STDistance 上的聚合函数(MIN)。

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),我可以显着减少它,但是唯一 id 的表仍然重复。该计划是一旦 select 语句起作用,我会将其转换为我的触发器 - 我希望答案基于它在触发器中的实现方式。

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • 谢谢 marc_s。 SELECT a.assetid,b.Assetid AS ROAD, b.shape.STDistance(a.shape) AS DIST FROM sde.TableA a join sde.TableB b on b.shape.STDistance(a.shape)
  • 12345 与表 b.AssetID = RD12222 的距离如何?
  • 通过利用 STDistance 函数here 两个表都有一个几何字段。

标签: sql sql-server spatial-query


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多