> ## Documentation Index
> Fetch the complete documentation index at: https://parabola.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Combine Tables

> Join data from multiple sources. Match rows by key columns, merge datasets, and handle mismatches.

The principle is simple: if we have two tables of data that are related to each other, we can use the **Combine Tables** step to join them into one table by matching rows between those tables.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/55xSH1bSQs7FexjG/images/transforms/image-5.gif?s=4bb8388b5467ad068a087b465a6eec31" alt="Animation showing two tables joining into one combined table using the Combine Tables step" width="570" height="300" data-path="images/transforms/image-5.gif" />
</Frame>

This step can handle combining two tables at a time. Once we set it up, we can use it repeatedly. Even if the quantity of rows changes, our step will continue working.

Check out the [Parabola University](https://parabola.io/resources/parabola-university) video below to learn more about the **Combine Tables** step.

<Frame>
  <iframe src="https://www.youtube.com/embed/wFTU7L_B1LI" title="Transforming data | Combine tables" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerPolicy="strict-origin-when-cross-origin" allowFullScreen />
</Frame>

## Input/output

The **Combine Tables** step requires two data inputs to combine. In our example below, we have two tables feeding into it. The first one is a table with columns labeled 'Variant ID', 'Product Name', 'Variant Name', and 'Sale Price'. The second one is a table with headers 'Variant ID' and 'Stock Quantity'.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-79.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=8ff0e6943aa4f9101fb651226a9f4eca" alt="First input table with Variant ID, Product Name, Variant Name, and Sale Price columns" width="668" height="443" data-path="images/transforms/image-79.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-80.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=76945e7f1e745522dfe675c9c6f44318" alt="Second input table with Variant ID and Stock Quantity columns" width="706" height="438" data-path="images/transforms/image-80.png" />
</Frame>

After using the **Combine Tables** step, our output data (shown below) has combined the 'Stock Quantity' column from the second table to the first table using 'Variant ID' as the matching identifier.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-81.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=f73670c6c5e2eb8db18fa907694d23be" alt="Combined output table showing Stock Quantity merged into the first table by Variant ID" width="703" height="445" data-path="images/transforms/image-81.png" />
</Frame>

## Custom settings

After connecting two datasets into this step, in the left-side toolbar choose whether you will 'Keep all rows' or 'Keep only matching rows' for your data sources using the drop down menus.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-82.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=4e58fccdc2a8654ad93094513db906f0" alt="Settings panel with 'Keep all rows' versus 'Keep only matching rows' dropdown options for each data source" width="1024" height="430" data-path="images/transforms/image-82.png" />
</Frame>

Then in the next set of options, click 'select' to access the dropdown menu of columns and select which ones to join the tables by. The column you choose should be present in both datasets, have identical values, and be used as the unique identifier between them.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-83.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=fa35066074c1b2a8309405a3862fe099" alt="Settings panel showing the column dropdowns used to select matching join keys between tables" width="1022" height="445" data-path="images/transforms/image-83.png" />
</Frame>

Once you're done, click 'Show Updated Results' to save and display the newly-combined tables.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-84.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=1635c2a7d29f75ba350f200a1adc8ed6" alt="Show Updated Results button confirming the combined table output" width="1040" height="479" data-path="images/transforms/image-84.png" />
</Frame>

If the datasets you want to combine don't have a shared column of identical values, then you can use [Insert row numbers](/product/transform/insert-row-numbers) to make one in each table. You'd do this by connecting your import datasets to an **Insert row numbers** step to generate matching columns with incrementally-increasing numbers.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-85.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=0e6f87913c9fce98ce1bbef2a59a75f6" alt="Two import datasets connected to Add row numbers steps to create matching join keys" width="889" height="609" data-path="images/transforms/image-85.png" />
</Frame>

## Other ways to combine tables:

Now we've learned one example using our default settings. Let's explore the other ways that we can combine tables in Parabola. We can switch our **Combine tables** step to keep all rows that have matches in all tables. The resulting table will only contain rows that exist in every table we are combining.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-86.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=ad61c5ec13952d597346bb955cee689f" alt="Settings showing 'Keep only matching rows' so the result keeps rows that exist in every table" width="1034" height="472" data-path="images/transforms/image-86.png" />
</Frame>

The last option is to keep all rows in all tables. This will create a resulting table that has every row from every table present. If no match was found for a specific row, it will still exist. This option has a tendency to create a lot of blank cells, and can be tricky to use properly.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-87.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=389d2c4c6b4c3119b993bc8e9568026a" alt="Settings showing 'Keep all rows in all tables' producing a full outer join with blank cells where no match exists" width="1032" height="474" data-path="images/transforms/image-87.png" />
</Frame>

## Helpful tips

* The default setting for the **Combine Tables** step is the most common way to combine tables. It keeps the entire primary table and finds matches in the other tables, fitting them in to their matched rows as we go. If a row doesn't have a match in the primary table, it won't show up in the results.
* Fuzzy match is not supported. [Find Overlap](/product/transform/find-overlap) is a better option, which supports fuzzy comparison
* To combine three or more tables together, chain together multiple **Combine Tables** steps to merge your data.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-88.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=9a09f0166ab93d5b4359bbd7a67375b2" alt="Canvas view showing multiple Combine Tables steps chained together to merge three or more tables" width="1162" height="738" data-path="images/transforms/image-88.png" />
</Frame>

* If we need multiple rules to determine a match, the default setting will find a match where any rules apply. We can change this so that rows match only when all of the rules apply.

<Frame>
  <img src="https://mintcdn.com/parabola-7119dfb0/HvW_RQOJLcDDJX8u/images/transforms/image-89.png?fit=max&auto=format&n=HvW_RQOJLcDDJX8u&q=85&s=f5eb7774ba501771ad2790e0b90060e5" alt="Settings panel showing multiple match rules with the option to require all rules to apply for a match" width="1032" height="484" data-path="images/transforms/image-89.png" />
</Frame>

## Troubleshooting tips

Here are a few common questions that come up around the **Combine tables** steps and ways to troubleshoot them:

**Issue**: I'm seeing my rows multiplied in the results section of the **Combine tables** step.

**Solution:** It's possible that you are matching on data that shows up multiple times in one or both of your sources. Check your inputs to make sure the selected matching columns have unique data in both inputs. If you don't have a column with unique data, you may need to choose multiple columns to match on to make sure you're not duplicating your rows.

**Issue:** I'm seeing a 'Missing columns' error in the **Combine tables** step.

**Solution:** This can happen when you remove or rename columns in your inputs, after you've already keyed to those columns in your **Combine tables** step. You'll need to either reselect your matching columns in the step or pull in a new **Combine tables** step.

## Related steps

* [Find overlap](/product/transform/find-overlap)
* [Stack tables](/product/transform/stack-tables)
* [Look up rows](/product/transform/look-up-rows)
* [Merge duplicate rows](/product/transform/merge-duplicate-rows)
* [Insert row numbers](/product/transform/insert-row-numbers)
