SQL Server检查任何行的where子句是否为true

时间:2015-03-15 11:08:08

标签: sql optimization sql-server-2014 spatial-query

我要选择与任何铁路相交的省份。所以我这样做(使用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" 
      ) 

那么是否有更好的方法可以为这样的目标重写此查询?

修改 令人惊讶的是,此查询需要相同的时间,不返回行

SELECT * FROM ProvinceTable
WHERE EXISTS (
       SELECT *
       FROM RailroadTable
       WHERE ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1 
      ) 

1 个答案:

答案 0 :(得分:3)

您想使用exists

SELECT pt.*
FROM ProvinceTable pt
WHERE EXISTS (SELECT 1
              FROM RailroadTable rt
              WHERE pt.Shape.STIntersects(rt.Shape) = 1 
             );