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¶
- Right-click target layer → Joins and Relates → Add Join.
- Set:
- Input Join Field — field on the layer
- Join Table — the CSV / table / layer
- Output Join Field — matching field on the table
- Click Validate Join (recommended). Confirms key types match.
- 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:
- Right-click layer → Data → Export Features.
- 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
- Add a counties layer (FIPS field).
- Add an ACS income CSV with
FIPSandMEDIAN_INC. - Validate types match (both should be Text).
- Add Join: Input Field = FIPS, Join Field = FIPS.
- Symbolize counties by
MEDIAN_INCwith graduated colors. - Export the joined layer to a permanent feature class.
→ Next: Buffers.