SQL 服务器检查任何行的 where 子句是否为真
SQL Server check if where clause is true for any row
我要去 select 那些与任何铁路相交的省份。所以我这样做(使用 SQL Spatial):
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"
)
那么有没有更好的方法来为这样的目标重写这个查询?
编辑
令人惊讶的是这个查询花费了相同的时间 returns no row:
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
);
我要去 select 那些与任何铁路相交的省份。所以我这样做(使用 SQL Spatial):
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"
)
那么有没有更好的方法来为这样的目标重写这个查询?
编辑 令人惊讶的是这个查询花费了相同的时间 returns no row:
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
);