使用 STIntersects 更新 table
Using STIntersects to update a table
我有两个 table 都有一个几何列:
- Table t 包含树
- Table ca 包含多边形保护区。
我正在尝试使用 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(因为每个组合都有单独的 Y
或 N
更新)。
我们可以做的是 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 以 任意 方式更新这些行。
我有两个 table 都有一个几何列:
- Table t 包含树
- Table ca 包含多边形保护区。
我正在尝试使用 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(因为每个组合都有单独的 Y
或 N
更新)。
我们可以做的是 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 以 任意 方式更新这些行。