有没有更有效的方法来返回SQL中最大空间交集的记录?

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)

我感觉我在运行相同的查询两次并将它们加入。有没有更有效的方法可以做到这一点?

谢谢

The*_*ler 1

由于第二个“表表达式”可以从第一个“表表达式”构建,因此您可以使用 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