我将选择那些与任何铁路相交的省份。所以我这样做(使用 SQL 空间):
SELECT * FROM ProvinceTable
WHERE (
SELECT count(*)
FROM RailroadTable
WHERE ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1
) > 0
但它效率不高,因为它必须检查每个铁路几何形状和省几何形状之间的交点才能计算count
。但是,最好在检测到每个第一个交叉点后立即停止 where 子句,而无需检查其他交叉点。我的意思是:
SELECT * FROM ProvinceTable
WHERE (
--return true if this is true for any row in the RailroadTable:
-- "ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1"
)
那么有没有更好的方法来为这样的目标重写这个查询呢?
编辑令人惊讶的是,此查询花费相同的时间并且不返回任何行:
SELECT * FROM ProvinceTable
WHERE EXISTS (
SELECT *
FROM RailroadTable
WHERE ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1
)
你想用exists
:
SELECT pt.*
FROM ProvinceTable pt
WHERE EXISTS (SELECT 1
FROM RailroadTable rt
WHERE pt.Shape.STIntersects(rt.Shape) = 1
);