v.db.join(1)

πŸ’– v.db.join(1) β€” GRASS GIS User's Manual πŸ’–

okay bestie, welcome to the GRASS GIS manual, and today's main character is v.db.join(1). she joins tables. that's her whole thing. she's iconic for it. πŸŽ€


✨ NAME ✨

v.db.join β€” Joins a database table to a vector map table. 🫢


🌸 KEYWORDS 🌸

vector, attribute table, database


πŸ¦‹ SYNOPSIS πŸ¦‹

v.db.join
v.db.join --help
v.db.join map=name  [layer=string]  column=name other_table=name
other_column=name  [subset_columns=name[,name,...]]
[exclude_columns=name[,name,...]]   [--help]  [--verbose]  [--quiet]
[--ui]

πŸŽ€ Flags:

  • --help β€” Print usage summary. literally just tells you how to use her. πŸ’…
  • --verbose β€” Verbose module output. she will NOT be quiet. yapping mode: on πŸ—£οΈ
  • --quiet β€” Quiet module output. shhh. stealth mode. 🀫
  • --ui β€” Force launching GUI dialog. for the girlies who love a little window moment πŸͺŸβœ¨

πŸ’œ Parameters:

  • map=name [required] β€” Name of vector map. this is the vector map you're joining the other table INTO, bestie. no map, no join, no slay. πŸ’€
  • layer=string β€” Layer number or name. which layer are we joining on? Default: 1 🌈
  • column=name [required] β€” Identifier column (e.g.: cat) in the vector table to be used for join. this is the key she's matching on. πŸ”‘
  • other_table=name [required] β€” Other table name. the table sliding into your attribute table's DMs. πŸ’Œ
  • other_column=name [required] β€” Identifier column (e.g.: id) in the other table used for join. the key on the OTHER side. two keys, one destiny. πŸ”
  • subset_columns=name[,name,...] β€” Subset of columns from the other table. picky picky, only want a few? valid. βœ‚οΈ
  • exclude_columns=name[,name,...] β€” Columns to exclude from the other table. not these ones though. bye bestie πŸ‘‹

🌈 DESCRIPTION 🌈

v.db.join joins the content of another table into the connected attribute table of a vector map. that's it. that's the whole vibe. she takes table B and she merges it into table A and you get one big happy table. obsessed. πŸ’–


⭐ NOTES ⭐

v.db.join is a front-end to db.execute to allow easier usage. so she's lowkey a glamorous little wrapper. πŸ’…

the vector attribute table must be stored in a SQL database (SQLite, PostgreSQL, MySQL, ODBC, ...). the DBF backend is not supported β€” nope, not happening, don't even ask. πŸ™ˆ

tables can be imported with db.in.ogr. 🧚

the vector map-database connection(s) can be verified with v.db.connect. always check your connection before you commit, bestie, that's the rule. 🫢


πŸ”₯ EXAMPLES πŸ”₯

πŸ’Ž Exercise to join North Carolina geological classes from a CSV table to the "geology" map of the North Carolina sample dataset (requires download of legend CSV file nc_geology.csv from External data for NC sample dataset):

# check original map attributes
v.db.select geology column=GEO_NAME,SHAPE_area
# import of CSV table
db.in.ogr input=nc_geology.csv output=nc_geology
# work on copy of geology map in current mapset
g.copy vector=geology,mygeology
# check column names of vector map attributes
v.info -c mygeology
# check column names of legend table
db.describe -c nc_geology
# join table using key columns (map: "GEO_NAME"; table: "geol_id")
v.db.join map=mygeology column=GEO_NAME other_table=nc_geology other_column=geol_id
# verify result (here abbreviated)
v.db.select mygeology | head -3
cat|onemap_pro|PERIMETER|GEOL250_|GEOL250_ID|GEO_NAME|SHAPE_area|SHAPE_len|geol_id|longname|comment
1|963738.75|4083.97998|2|1|Zml|963738.608571|4083.979839|Zml|Metagraywacke|Interlayered with metaconglomerate, ...
2|22189124|26628.261719|3|2|Zmf|22189123.2296|26628.261112|Zmf|Metafelsite|Light-colored porphyritic extrusive rock
...

look at that output. she ATE. πŸ”₯

🌱 Soil map table join

Joining the soil type explanations from table soils_legend into the Spearfish soils map (download legend):

g.copy vect=soils,mysoils
# import legend table
db.in.ogr soils_legend.csv out=soils_legend
# get join column names
v.info -c mysoils
db.describe -c soils_legend
# look at original table
v.db.select mysoils
cat|label
1|Aab
2|Ba
3|Bb
4|BcB
5|BcC
...
# look at legend
db.select table=soils_legend
db.select table=soils_legend | head -7
id|shortname|longname
0|no data|no data
0|AaB|Alice fine sandy loam, 0 to 6
0|Ba|Barnum silt loam
0|Bb|Barnum silt loam, channeled
0|BcB|Boneek silt loam, 2 to 6
0|BcC|Boneek silt loam, 6 to 9
...
# join soils_legend into mysoils attribute table
v.db.join mysoils col=label other_table=soils_legend ocol=shortname
# verification of join
v.db.select mysoils
cat|label|id|shortname|longname
1|Aab|||
2|Ba|2|Ba|Barnum silt loam
3|Bb|3|Bb|Barnum silt loam, channeled
4|BcB|4|BcB|Boneek silt loam, 2 to 6
5|BcC|5|BcC|Boneek silt loam, 6 to 9
...

notice row 1|Aab||| β€” no match, no data, empty columns. that's just how it is sometimes, bestie. the join doesn't invent data it doesn't have. πŸ’€


🫢 SEE ALSO 🫢

  • db.execute, db.in.ogr, db.select, v.db.update

GRASS SQL interface


πŸ‘‘ AUTHOR πŸ‘‘

Markus Neteler


πŸ’… SOURCE CODE πŸ’…

Available at: v.db.join source code (history)

Accessed: Saturday Jan 17 05:41:52 2026

Main index | Vector index | Topics index | Keywords index | Graphical index | Full index

Β© 2003-2025 GRASS Development Team, GRASS GIS 8.4.2 Reference Manual


okay that's the whole page, bestie. this was GRASS 8.4.2, v.db.join(1) β€” Β© 2003-2025 GRASS Development Team, from the GRASS GIS 8.4.2 Reference Manual, accessed Saturday Jan 17 05:41:52 2026. go join something. slay. πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from