创建查询表 (数据管理)

摘要

可对数据库应用 SQL 查询,并在图层或表视图中表示结果。 查询可用于连接多个表或返回数据库的原始数据中的字段或行的子集。

此工具可接受来自地理数据库或 OLE DB 连接的数据。

使用情况

  • 由于此工具创建的图层是临时图层,因此如果不保存文档,该图层将在会话结束后消失。

  • 所有的输入要素类或表必须来自同一输入工作空间。

  • 如果将 Shape 字段添加到字段列表,结果将为图层,否则将为表视图。

  • 如果输出结果为图层,则可以使用保存至图层文件工具将输出结果保存在图层文件中,也可以使用复制要素工具将其保存到要素类。

  • 字段列表中字段的顺序为这些字段将在输出图层或表视图中出现的顺序。

  • 提供关键字段选项和关键字段列表。 此信息定义行的唯一识别方式,并可用于将动态生成的 Object ID 字段添加到数据。 如果没有 Object ID 字段,将不会支持选择。

  • 如果需要多个字段的组合来定义唯一值,则可以从关键字段列表中选择这些字段。

  • 如果使用了 SQL 表达式但却未返回任何匹配记录,则输出要素类将为空。

  • 可以连接要素类,但字段列表最多只能包含一个几何类型字段。

  • 有关表达式参数的语法的详细信息,请参阅 SQL 模式

  • 如果输入表来自文件地理数据库,这些表通常会按在输入表参数中列出的顺序进行连接。 例如,如果 Table1 列于 Table2 之前,则将对 Table2 进行连接,方法为从 Table1 中取出一行,然后再从 Table2 中获取匹配行。 但是,假如这造成了对 Table2 的无索引字段进行查询,而反转顺序会造成对 Table1 的有索引字段进行查询,那么将会反转顺序以试图获得最佳性能。 使用此工具处理文件地理数据库数据时,这是唯一起作用的查询优化逻辑。 通常,当连接方式为一对多或一对一时,文件地理数据库中的连接会达到最佳性能。

参数

标注说明数据类型
输入表

要在查询中使用的一个表或多个表的名称。 如果列出多个表,表达式参数可用于定义这些表的连接方式。

输入表可来自地理数据库或数据库连接。

Table View; Raster Layer
表名

将创建的图层或表视图的名称。

Table View; Raster Layer
关键字段选项

指定将如何针对查询生成 Object ID 字段(如果存在)。 ArcGIS 中的图层和表视图需要 Object ID 字段。 Object ID 字段是一个整型字段,用于唯一标识正在使用的数据中的行。

  • 使用关键字段关键字段参数中的指定字段将用于唯一标识输出表中的行。 该字段可以是单一字段也可以是多个字段,合并后可唯一标识输出表中的行。 如果未在关键字段列表中未指定任何字段,则会应用生成关键字段选项。 这是默认设置。
  • 生成关键字段如果未指定任何关键字段,则将在输出表每行中生成唯一标识的 Object ID 字段。
  • 无关键字段不会生成任何 Object ID 字段。 表视图将不支持选择。
    注:

    如果 Object ID 字段已经存在,那么即使选择此选项,也仍会使用该字段。

  • 使用关键字段in_key_field 参数中的指定字段将用于唯一标识输出表中的行。 该字段可以是单一字段也可以是多个字段,合并后可唯一标识输出表中的行。 如果未在关键字段列表中未指定任何字段,则会应用 ADD VIRTUAL_KEY_FIELD 选项。
  • 生成关键字段如果未指定任何关键字段,则将在输出表每行中生成唯一标识的 Object ID 字段。
  • 无关键字段不会生成任何 Object ID 字段。 表视图将不支持选择。
    注:

    如果 Object ID 字段已经存在,那么即使选择此选项,也仍会使用该字段。

String
关键字段
(可选)

将用于唯一识别查询中的一行的字段或字段组合。 此参数仅在将关键字段选项参数设置为使用关键字段时使用。

Field
字段
(可选)

将包含在图层或表格视图中的字段。 如果为字段设置了一个别名,则这个别名就是显示的名称。 如果未指定任何字段,则将包含所有表中的所有字段。 如果将 Shape 字段添加到字段列表,结果将为图层,否则将为表视图。

Value Table
表达式
(可选)

用于选择记录子集的 SQL 表达式。

SQL Expression

arcpy.management.MakeQueryTable(in_table, out_table, in_key_field_option, {in_key_field}, {in_field}, {where_clause})
名称说明数据类型
in_table
[in_table,...]

要在查询中使用的一个表或多个表的名称。 如果列出多个表,where_clause 参数可用于定义这些表的连接方式。

输入表可来自地理数据库或数据库连接。

Table View; Raster Layer
out_table

将创建的图层或表视图的名称。

Table View; Raster Layer
in_key_field_option

指定将如何针对查询生成 Object ID 字段(如果存在)。 ArcGIS 中的图层和表视图需要 Object ID 字段。 Object ID 字段是一个整型字段,用于唯一标识正在使用的数据中的行。

  • USE_KEY_FIELDSin_key_field 参数中的指定字段将用于唯一标识输出表中的行。 该字段可以是单一字段也可以是多个字段,合并后可唯一标识输出表中的行。 如果未在关键字段列表中未指定任何字段,则会应用 ADD VIRTUAL_KEY_FIELD 选项。
  • ADD_VIRTUAL_KEY_FIELD如果未指定任何关键字段,则将在输出表每行中生成唯一标识的 Object ID 字段。
  • NO_KEY_FIELD不会生成任何 Object ID 字段。 表视图将不支持选择。
    注:

    如果 Object ID 字段已经存在,那么即使选择此选项,也仍会使用该字段。

String
in_key_field
[in_key_field,...]
(可选)

将用于唯一识别查询中的一行的字段或字段组合。 此参数只能在将 in_key_field_option 参数设置为 USE_KEY_FIELDS 时使用。

Field
in_field
[[field, {alias}],...]
(可选)

将包含在图层或表格视图中的字段。 如果为字段设置了一个别名,则这个别名就是显示的名称。 如果未指定任何字段,则将包含所有表中的所有字段。 如果将 Shape 字段添加到字段列表,结果将为图层,否则将为表视图。

Value Table
where_clause
(可选)

用于选择记录子集的 SQL 表达式。

SQL Expression

代码示例

MakeQueryTable 示例 1(Python 窗口)

以下 Python 窗口脚本演示了如何在即时模式下使用 MakeQueryTable 函数。

import arcpy
arcpy.env.workspace = "C:/data/data.gdb"
arcpy.management.MakeQueryTable(["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'")
MakeQueryTable 示例 2(独立脚本)

以下脚本是如何在 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.
 
# Import system modules
import arcpy
 
# Local variables...
tableList = ["c:/Connections/balrog.odc/vtest.COUNTIES",\
             "c:/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.management.MakeQueryTable(tableList, lyrName,"USE_KEY_FIELDS", keyField, fieldList, whereClause)

# Print the total rows
print(arcpy.management.GetCount(lyrName))
 
# Print the fields
fields = arcpy.ListFields(lyrName)
for field in fields:
    print(field.name)

# Save as a dBASE file
arcpy.management.CopyRows(lyrName, "C:/temp/calinfo.dbf")

相关主题