使用 STIntersects 更新 table

Using STIntersects to update a table

我有两个 table 都有一个几何列:

我正在尝试使用 SQL 服务器和 STIntersects 计算出某些树木何时落在保护区内。

在 运行 我的更新查询之后,落在保护区内的树木仍被报告为在保护区外。我认为这是由于我的保护区 table 包含多个记录。

一个解决方案可能是合并保护区中的所有多边形 table,但我假设有更好的方法来解决这个问题。

UPDATE [TREES]
SET 
  IN_CONSERVATION_AREA = 
    CASE
      WHEN 
        t.[geom].STIntersects(ca.[geom]) = 1 THEN 'Y'
      WHEN
        t.[geom].STIntersects(ca.[geom]) = 0 THEN 'N'
     END

FROM [CONSERVATION_AREA] ca,[TREES] t

如果一棵树在保护区内,我希望输出为 'Y',否则为 'N'。

您正在将所有树木加入所有保护区。大概每个保护区内都没有树,所以最终结果是什么样子取决于SQL服务器选择应用1(因为每个组合都有单独的 YN 更新)。

我们可以做的是 LEFT JOIN 使用相交测试:

UPDATE t
SET 
  IN_CONSERVATION_AREA = CASE
       WHEN ca.geom IS NULL
          THEN 'N'
       ELSE 'Y' END
FROM [TREES] t
  LEFT JOIN
    [CONSERVATION_AREA] ca
  ON t.[geom].STIntersects(ca.[geom]) = 1

如果一棵树在多个保护区内,这仍将尝试多次更新那棵树,但至少所有更新都是相同的(Y ).

另请注意,在这种新形式中,它有可能受益于 Spatial Indexes,您希望如此。

正如我在评论中所说的那样,如果您确实有索引,我建议首先测试在 检索 数据执行充分时是否执行相同的逻辑。更喜欢而不是来存储可以计算的数据——它只是留下了它过时的可能性(例如,当有人添加了一个新的保护区时)


1一些数据库系统会报错 "row subject to multiple update!"。但不是 SQL 服务器。相反,documented 任意 方式更新这些行。