Make Query Table (Data Management)


This tool applies an SQL query to a database and the results are represented in a layer or table view. The query can be used to join several tables or return a subset of columns or rows from the original data in the database.

This tool accepts data from an ArcSDE geodatabase, a file geodatabase, a personal geodatabase, or an OLE DB connection.



MakeQueryTable_management (in_table, out_table, in_key_field_option, {in_key_field}, {in_field}, {where_clause})
ParameterExplanationData Type

The name of the table or tables to be used in the query. If several tables are listed, the Expression parameter can be used to define how they are to be joined.

The input table can be from an ArcSDE geodatabase, a file geodatabase, a personal geodatabase, or an OLE DB connection.

Table View; Raster Layer

The name of the layer or table view that will be created by the tool.

Table View;Raster Layer

Indicates how an ObjectID field will be generated, if at all, for the query. The default is USE_KEY_FIELDS.

  • USE_KEY_FIELDSThis indicates that the fields chosen in the key fields list should be used to define the dynamic ObjectID column. If there are no fields chosen in the key fields list, the ADD VIRTUAL_KEY_FIELD option is automatically applied.
  • ADD_VIRTUAL_KEY_FIELDThis option indicates that no key fields have been chosen, but a dynamic ObjectID column is to be generated. This is done by copying the data to a local, system-managed workspace and adding a field with unique values to the copy. The layer or table view can then access the copy and use the added field as the key field.
  • NO_KEY_FIELDThis option indicates that no dynamic ObjectID column is to be generated. Choosing this option means that selections will not be supported for the table view. If there is already a column of type ObjectID in the fields list, it will be used as the ObjectID even if this option is chosen.

Specifies a field or combination of fields that can be used to uniquely identify a row in the query. This parameter is used only when the USE_KEY_FIELDS option is set.

The Add Field button, which is used only in ModelBuilder, allows you to add expected field(s) so you can complete the dialog and continue to build your model.

[[Field, {Alias}],...,...]

The fields to include in the layer or table view. If an alias is set for a field, this is the name that appears. If no fields are specified, all fields from all tables are included.

Value Table

An SQL expression used to select a subset of records. The syntax for the expression differs slightly depending on the data source. For example, if you're querying file or ArcSDE geodatabases, shapefiles, coverages, or dBASE or INFO tables, enclose field names in double quotes:


If you're querying personal geodatabases, enclose fields in square brackets:


In Python, strings are enclosed in matching single or double quotes. To create a string that contains quotes (as is common with a WHERE clause in SQL expressions), you can escape the quotes (using a backslash) or triple quote the string. For example, if the intended WHERE clause is

"CITY_NAME" = 'Chicago'

you could enclose the entire string in double quotes, then escape the interior double quotes like this:

" \"CITY_NAME\" = 'Chicago' "

Or you could enclose the entire string in single quotes, then escape the interior single quotes like this:

' "CITY_NAME" = \'Chicago\' '

Or you could enclose the entire string in triple quotes without escaping:

""" "CITY_NAME" = 'Chicago' """

For more information on SQL syntax and how it differs between data sources, see the help topic SQL reference for query expressions used in ArcGIS.

SQL Expression

Code Sample

MakeQueryTable Example (Python Window)

The following Python window script demonstrates how to use the MakeQueryTable function in immediate mode.

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'")
MakeQueryTable Example 2 (Stand-alone Script)

The following script is an example of how to use the MakeQueryTable tool in the Python scripting environment.

# 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
    # 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:
    # 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


Related Topics

Licensing Information

ArcView: Yes
ArcEditor: Yes
ArcInfo: Yes