Skip to main content

控制 SQL 查询中的运算顺序

运行 SQL 查询时,需要了解并管理子句的评估顺序,以便生成您所期望的结果。

在这种情况下,假设您正在使用全球人口统计数据库,并且希望查找人口数至少为 100,000 的中国城市或者省会城市。

分组和取消分组子句

在包含多个子句的查询中,可以分组和取消分组子句来控制操作顺序。 要对两个或多个子句进行分组,请按住 Shift 键并单击子句将其选中,然后单击分组子句 。 要取消子句分组,请在组中选择一个子句,然后单击取消子句分组

以下是同一查询的两个示例。 第一个示例不使用子句分组,并且返回的结果与预期不符。 在第二个示例中,对子句进行了分组以强制执行正确的运算顺序,从而返回预期结果。

未分组的子句

运行此未分组的查询后,将首先查找中国的所有城市,然后过滤人口超过 100,000 的中国城市。 接下来,将根据 Or 运算符对整个数据集进行评估,以返回省会城市。 最终结果为人口超过 100,000 的中国城市以及全球所有的省会城市,这不是我们想要的结果。 这是因为 And 运算符的优先级高于 Or 运算符,因此将首先评估 And 运算符。

查询中未分组的三个子句

分组的子句

在此第二个示例中,要返回预期结果,必须首先评估 Or 运算符。 您可以对子句进行分组以强制执行运算顺序。 将先评估组中的子句,然后再评估组外的子句。

查询中的三个子句,其中对后两个子句进行了分组

应用分组后,查询将首先评估组中的子句,即:城市人口至少为 100,000,或者城市为省会城市。 接下来,查询将评估该城市是否为中国城市。 然后,And 运算符可以确保查询正确返回同时满足两个条件的城市,即:人口至少为 100,000 的中国城市或者为省会城市。

对子句进行分组相当于将它们括在括号中。 在 SQL 编辑器模式中,此查询如下所示:

CNTRY_NAME = 'China' And (POP > 100000 Or STATUS = 'Provincial capital')

设置属性子句优先级

在对企业级地理数据库要素类进行查询时,客户端 (ArcGIS Pro) 会通过 SQL 查询访问数据库,对数据库中的数据源运行查询,并返回结果。 在使用地图视图时,可以选择是在对数据库中的要素类运行查询过程中执行空间子句(默认),还是延迟在客户端执行,直到处理完查询的属性子句。 在查询编辑模式下,单击菜单图标 ,选中设置属性子句优先级选项,以在数据库过滤要素后在客户端中应用空间子句。 这可以提高绘制性能。

注:

该选项仅在图层数据源为企业级地理数据库要素类时存在。