--- title: "Joins" slug: "joins" updated: 2026-07-16T23:24:51Z published: 2026-07-16T23:24:51Z canonical: "knowledge.technolutions.net/joins" stale: true --- > ## Documentation Index > Fetch the complete documentation index at: https://knowledge.technolutions.net/llms.txt > Use this file to discover all available pages before exploring further. # Joins Data, such as person records, fields, and mailings, are organized and stored in **tables**. You can think of a table as a single page in a spreadsheet, with each data object taking up a row. A collection of these tables form a Relational Database, like Slate. A join allows you combine data from two (or more) tables based on a related column they share, like `record_id`. For example, you can join a *Person* table to the *Applications* table to see all the application records a person may have. ## Relationships between tables Relationships between the tables in a Slate database are established in one of two ways: **one-to-one** relationships, or **one-to-many** relationships. - **One-to-one**: An object on one table relates to only one object on another table. For instance, any application record can only be related to *one* person record. - **One-to-many**: An object on one table can relate to one or more objects on another table. For instance, a person record in the *Person* table can be related to multiple application records in the *Application* table. ## Joins The mechanism by which you create these relationships is called a **join.** Joins increase the flexibility and usefulness of queries by combining data from multiple tables; without joins, you could only query on data from one table at a time. In the below example, we can see a **one-to-one** join called *Device by Type, Rank* and a **one-to-many** join called *Devices.* Notice the muted one-to-many icon ![download.png](https://cdn.us.document360.io/cd8ea7a6-07f3-4846-a554-627ac016d3e3/Images/Documentation/download.png) next to one-to-many joins. ![mceclip0.png](https://cdn.us.document360.io/cd8ea7a6-07f3-4846-a554-627ac016d3e3/Images/Documentation/r2rqo6jps0aiy33ybyvnwmceclip0.png) Understanding these relationships is integral to building a successful query. To learn more about object relations in Slate or joins in Configurable Joins, use the Configurable Joins Base Explorer tool in the *Database* section of your database. 📖 [Slate Database Structure](/docs/slate-database-structure) ## Types of Joins There are **three types of joins**: ### 1) One-to-One Returns **up to one** object. #### Useful for: - Retrieving a single object associated with a record, like the corresponding person record for an application. ### 2) One-to-Many Can return **more than one** object. #### Useful for: - Retrieving several objects associated with a record, like all event registrations for a record. ### 3) Subquery Join Returns **up to one** object. #### Useful for: - Retrieving one of many objects associated with a record that is not normally [ranked by Slate](/v1/docs/database-structure-determination-of-table-ranks), such as returning the next upcoming event registration for a record - Using an independent subquery to join objects that are not explicitly related. ## Locations to Add a Join There are **two places to perform a join** within a query: ### 1) At the main level These are joins added at the base of your main query/level. These joins will only ever return up to one object, which is why you will almost never want to make a one-to-many join at the main level. #### Useful for: - Filtering for records who have a rank 1 overall address in the United States and exporting the address information using the "Address by Rank Overall" join - Exporting information about a records rank 1 high school using the "School by Level of Study, Rank" join ### 2) As a subquery export or subquery filter These are joins added inside of a subquery export or subquery filter. Subquery exports and filters allow for one-to-many joins to return more than 1 object #### Useful for: - Exporting a comma-delimited list of phone numbers for a record - Counting the number of applications related to a person record - Summing the lifetime giving for a person record > [!TIP] > ⭐ Best Practice > > - You very rarely need to make a one-to-many join at the main level of a query. > - For instance, if you wanted to exclude records by making a base join from Person to Tags, Slate would randomly retrieve one tag set for that record. That tag may or may not be the *Test Record* tag. > - Instead, use a subquery filter that joins from Person to Tags so we can look at all tags associated with a person record, like so: > > ![mceclip3.png](https://cdn.us.document360.io/cd8ea7a6-07f3-4846-a554-627ac016d3e3/Images/Documentation/olrbawj53uy4msdaezqcewmceclip3.png) #### 📖 Further reading - [Subquery Exports](/v1/docs/subquery-exports-outputs) - [Subquery Filter](/v1/docs/subquery-filters) ### Types & Locations Combining the above two sections, we can see the relationship between a join's location and its type: | **Join Type** | **Location Added** | **Returns** | | --- | --- | --- | | **One-to-one** | Main Level | Up to 1 object | | **One-to-many** | Main Level | Up to 1 object | | **Subquery Join** | Main Level | Up to 1 object | | **One-to-one** | [**Subquery Export**](/v1/docs/subquery-exports-outputs) or [**Subquery Filter**](/v1/docs/subquery-filters) | Up to 1 object | | **One-to-many** | [**Subquery Export**](/v1/docs/subquery-exports-outputs) or [**Subquery Filter**](/v1/docs/subquery-filters) | Up to N objects | | **Subquery Join** | [**Subquery Export**](/v1/docs/subquery-exports-outputs) or [**Subquery Filter**](/v1/docs/subquery-filters) | Up to 1 object | Deciding what path to take ultimately depends on what you're looking to accomplish with your query. Relational databases are organized collections of data stored in tables, where each table consists of rows and columns. These databases use structured relationships between tables to efficiently manage and retrieve data.