Skip to content

8. Joins & Relates

Goal: Bring in data from a CSV, table, or another feature class using a shared key field.


Join vs relate

Join Relate
Cardinality One-to-one or many-to-one One-to-many or many-to-many
What you see Joined fields appear in the layer's table A pop-up shows related rows when you click a feature
Use for "Add population to my counties layer" "Show the violations history for this parcel"

99% of the time, you want a join.

How to join

  1. Right-click target layer → Joins and Relates → Add Join.
  2. Set:
    • Input Join Field — field on the layer
    • Join Table — the CSV / table / layer
    • Output Join Field — matching field on the table
  3. Click Validate Join (recommended). Confirms key types match.
  4. Click OK.

The joined fields appear at the right of your attribute table.

Field types must match

You can join Text → Text or Long → Long, but not Long → Text. Convert one side first if needed.

FIPS / ZIP codes

Census FIPS codes have leading zeros (e.g., 06037 for Los Angeles County). If you import a CSV and the FIPS column gets parsed as a number, the leading zero disappears and the join silently fails for those counties.

Fix: import the CSV explicitly as text for that field. In ArcGIS Pro, open the Schema of the import and set the field to Text.

Cardinality matters

flowchart LR
    L[Counties layer<br/>3,143 rows] --> J((1:1 Join))
    T[Population CSV<br/>3,143 rows]   --> J
    J --> O[Counties + pop]

    L2[Parcels layer<br/>50,000 rows] --> J2((Many:1))
    T2[Land use codes<br/>50 rows] --> J2
    J2 --> O2[Each parcel gets<br/>its land use description]

    classDef l fill:#dbeafe,stroke:#1e40af,color:#1e3a8a
    classDef t fill:#fef3c7,stroke:#f59e0b,color:#92400e
    classDef o fill:#dcfce7,stroke:#10b981,color:#065f46
    class L,L2 l
    class T,T2 t
    class O,O2 o

If the table side has multiple rows per key, ArcGIS Pro keeps only the first match — silently. To preserve all matches, use Add Relate or summarize the table to one row per key first.

Save the join (export)

A join is a virtual view. The fields aren't really part of your feature class. To make them permanent:

  1. Right-click layer → Data → Export Features.
  2. The exported feature class will have the joined fields baked in.

This is the safe move before further analysis or sharing.

Remove a join

Right-click layer → Joins and Relates → Remove Join → (select). The joined fields disappear; the underlying data is unchanged.

Common pitfalls

Watch out

  • No matches → field types or values mismatched. Use Validate Join.
  • Silent partial matches → check the join field in the table for typos or different casing ('GA' vs 'Ga').
  • Performance → joining a 1 M-row CSV will be slow. Pre-filter or summarize first.

Spatial join (preview)

If there's no shared field but the layers overlap geographically, use a Spatial Join instead. → See Spatial Join.


Practice

Income choropleth via join

  1. Add a counties layer (FIPS field).
  2. Add an ACS income CSV with FIPS and MEDIAN_INC.
  3. Validate types match (both should be Text).
  4. Add Join: Input Field = FIPS, Join Field = FIPS.
  5. Symbolize counties by MEDIAN_INC with graduated colors.
  6. Export the joined layer to a permanent feature class.

→ Next: Buffers.