创建查询表 (Data Management)
摘要
此工具可对数据库应用 SQL 查询,并在图层或表视图中表示结果。查询可用于连接多个表或返回数据库的原始数据中的列或行的子集。
此工具可接受来自 ArcSDE 地理数据库、文件地理数据库、个人地理数据库或 OLE DB 连接的数据。
用法
由于此工具创建的图层是临时图层,因此如果不保存文档,该图层将在会话结束后消失。
-
所有的输入要素类或表必须来自同一输入工作空间。
-
如果将“形状”列添加到字段列表,结果将为图层,否则将为表视图。
-
字段列表中字段的顺序表示这些字段将在输出图层或表视图中出现的顺序。
-
该工具可用于提供关键字段选项和关键字段列表。此信息定义行的唯一识别方式,并可用于将动态生成的 ObjectID 列添加到数据。如果没有 ObjectID 列,将不会支持选择。
-
如果需要多个列的组合来定义唯一值,可以通过关键字段列表选择这些列。
-
如果使用了 SQL 表达式但却未返回任何匹配记录,则输出要素类将为空。
-
可以连接要素类,但字段列表最多只能包含一个几何类型字段。如果添加多个几何列,工具会在您单击确定时显示出错,执行也会停止。
-
有关表达式参数语法的详细信息,请参阅构建 SQL 表达式或 SQL 参考。
-
字段和关键字段参数的添加字段按钮只能在模型构建器中使用。在模型构建器中,如果先前的工具尚未运行或其派生数据不存在,则可能不会使用字段名称来填充字段和关键字段参数。“添加字段”按钮可用于添加所需字段,以完成“创建查询表”对话框并继续构建模型。
-
如果输入表来自文件地理数据库,这些表通常会按在“输入表”参数中列出的顺序进行连接。例如,如果 Table1 列于 Table2 之前,则将对 Table2 进行连接,方法为从 Table1 中取出一行,然后再从 Table2 中获取匹配行。但是,假如这造成了对 Table2 的无索引字段进行查询,而反转顺序会造成对 Table1 的有索引字段进行查询,那么将会反转顺序以试图获得最佳性能。使用此工具处理文件地理数据库数据时,这是唯一起作用的查询优化逻辑。通常,当连接方式为一对多和一对一时,文件地理数据库中的连接会达到最佳性能。
语法
参数 | 说明 | 数据类型 |
in_table [in_table,...] |
要在查询中使用的一个表或多个表的名称。如果列出多个表,“表达式”参数可用于定义这些表的连接方式。 输入表可以来自 ArcSDE 地理数据库、文件地理数据库、个人地理数据库或 OLE DB 连接。 | Table View; Raster Layer |
out_table |
将通过该工具创建的图层或表视图的名称。 | Table View;Raster Layer |
in_key_field_option |
表示将如何针对查询生成 ObjectID 字段(如果存在)。默认设置为 USE_KEY_FIELDS。
| String |
in_key_field [in_key_field,...] (可选) |
指定可用于唯一识别查询中的一行的字段或字段组合。只可在设置 USE_KEY_FIELDS 选项后使用此参数。 “添加字段”按钮(只能在模型构建器中使用)可用于添加所需字段,以便您可以完成对话框并继续构建模型。 | Field |
in_field [[Field, {Alias}],...,...] (可选) |
要包含在图层或表视图中的字段。如果为字段设置了一个别名,则这个别名就是显示的名称。如果未指定任何字段,则将包含所有表中的所有字段。 | Value Table |
where_clause (可选) |
用于选择记录子集的 SQL 表达式。表达式的语法会因数据源的不同而稍有不同。例如,如果要查询文件或 ArcSDE 地理数据库、shapefile、coverage、dBASE 或 INFO 表,需将字段名用双引号括起: "MY_FIELD" 如果要查询个人地理数据库,需将字段用方括号括起: [MY_FIELD] 在 Python 中,字符串用成对的单引号或双引号括起。要创建含有引号的字符串(常见于 SQL 表达式中的 WHERE 子句),可以对引号进行转义(使用反斜线)或对字符串使用三重引号。例如,如果所需的 WHERE 子句为 "CITY_NAME" = 'Chicago' 可以将整个字符串用双引号括起,然后如下所示对内部双引号进行转义: " \"CITY_NAME\" = 'Chicago' " 或者可以将整个字符串用单引号括起,然后如下所示对内部单引号进行转义: ' "CITY_NAME" = \'Chicago\' ' 或者不进行转义,而将整个字符串用三重引号括起: """ "CITY_NAME" = 'Chicago' """ 有关 SQL 语法及其在不同数据源中的差异的详细信息,请参阅帮助主题在 ArcGIS 中使用查询表达式的 SQL 参考。 | SQL Expression |
代码实例
以下 Python 窗口脚本演示了如何在即时模式下使用 MakeQueryTable 函数。
import arcpy
from arcpy import env
env.workspace = "C:/data/data.gdb"
arcpy.MakeQueryTable_management (["Counties","codemog"], "queryout","ADD_VIRTUAL_KEY_FIELD", "",
[["Counties.OBJECTID", 'ObjectID'],["Counties.NAME", 'Name'],
["codemog.Males", 'Males'], ["codemog.Females", 'Females']],
"Counties.FIPS = codemog.Fips and Counties.STATE_NAME = 'California'")
以下脚本是如何在 Python 脚本环境中使用 MakeQueryTable 工具的示例。
# MakeQueryTableOLEDB.py
# Description: Create a query table from two OLE DB tables using a limited set of
# fields and establishing an equal join.
# Author: ESRI
# Import system modules
import arcpy
try:
# Local variables...
tableList = ["Database Connections/balrog.odc/vtest.COUNTIES",\
"Database Connections/balrog.odc/vtest.CODEMOG"]
fieldList = [["vtest.COUNTIES.OBJECTID", 'ObjectID'],["vtest.COUNTIES.NAME", 'Name']\
["vtest.CODEMOG.Males", 'Males'],["vtest.CODEMOG.Females", 'Females']]
whereClause = "vtest.COUNTIES.FIPS = vtest.CODEMOG.Fips" +\
"and vtest.COUNTIES.STATE_NAME = 'California'"
keyField = "vtest.COUNTIES.OBJECTID"
lyrName = "CountyCombined"
# Make Query Table...
arcpy.MakeQueryTable_management(tableList, lyrName,"USE_KEY_FIELDS", keyField, fieldList, whereClause)
# Print the total rows
print arcpy.GetCount_management(lyrName)
# Print the fields
Fields = arcpy.ListFields(lyrName)
for field in Fields:
print Field.name
# Save as a dBASE file
arcpy.CopyRows_management(lyrName, "C:/temp/calinfo.dbf")
except Exception, e:
# If an error occurred, print line number and error message
import traceback, sys
tb = sys.exc_info()[2]
print "Line %i" % tb.tb_lineno
print e.message