【问题标题】:SQL Server check if where clause is true for any rowSQL Server 检查 where 子句对于任何行是否为真
【发布时间】:2015-03-15 11:08:08
【问题描述】:

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

【问题讨论】:

  • 可以在内连接中使用这些形状构造吗?如图所示here
  • 我认为这个想法不会提高性能,因为必须使用内部连接检查每一行的交集。

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


【解决方案1】:

你想使用exists:

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

【讨论】:

  • 我之前检查过这个方法,令人惊讶的是它没有返回任何行!此外,它需要与count(*) 方法一样多的时间来运行!
  • @HosseinNarimaniRad 支票必须是=1。尽管如此,这仍然可以最终测试针对他们笛卡尔积的条件。你有空间索引吗?
  • @MartinSmith 你是对的。不,没有可用的空间索引。我更喜欢专注于查询优化
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多