mkm*_*ell 5 sql sql-server geometry
我在SQL中有两个表。第一个是项目多边形。第二个是我要基于最大空间交集应用于多边形的任何边界。
例如,如果项目1重叠2个状态,我想返回项目1所在区域最多的状态名称。
我已经完成了下面的查询。PrjID是项目表,STATE是状态表。我想根据每个PrjID记录和STATE记录之间的最大交集返回statename。
SELECT *
FROM
(SELECT a.PROJECT_DELIVERY_ID, b.statename, a.Shape.STIntersection(b.Shape).STArea() AS Area
FROM PrjID a
INNER JOIN STATE b
ON a.Shape.STIntersects(b.Shape) = 1) as c
INNER JOIN
(SELECT a.PROJECT_DELIVERY_ID, MAX(a.Shape.STIntersection(b.Shape).STArea()) AS Area
FROM PrjID a
INNER JOIN STATE b
ON a.Shape.STIntersects(b.Shape) = 1
GROUP BY a.PROJECT_DELIVERY_ID) as d
ON c.PROJECT_DELIVERY_ID = d.PROJECT_DELIVERY_ID
AND c.Area = d.Area
Run Code Online (Sandbox Code Playgroud)
我感觉我在运行相同的查询两次并将它们加入。有没有更有效的方法可以做到这一点?
谢谢
由于第二个“表表达式”可以从第一个“表表达式”构建,因此您可以使用 CTE(通用表表达式),如下所示:
with
c as (
SELECT
a.PROJECT_DELIVERY_ID,
b.statename,
a.Shape.STIntersection(b.Shape).STArea() AS Area
FROM PrjID a
INNER JOIN STATE b ON a.Shape.STIntersects(b.Shape) = 1
),
d as (
select PROJECT_DELIVERY_ID, max(Area) AS Area
from c
group by PROJECT_DELIVERY_ID
)
select *
from c
join d on c.PROJECT_DELIVERY_ID = d.PROJECT_DELIVERY_ID
AND c.Area = d.Area
Run Code Online (Sandbox Code Playgroud)
这里d是从 计算出来的c。无需再次扫描PrjID表格STATE。