Entity relationship overview
Here’s how the main tables connect:- People join to Organizations via
RBID_ORG = RBID(many-to-one) - Insights join to Organizations via
RBID_ORG = RBID(one-to-one, company-level only) - People can join to Insights via
RBID_ORG = RBID_ORG(many-to-one, gets company-level insights) - Historical Experience joins to People via
linkedin_url(one-to-one)
Join keys reference
| From table | To table | Join key | Join type | Notes |
|---|---|---|---|---|
PER_LATEST | ORG_LATEST | per.RBID_ORG = org.RBID | LEFT JOIN | Not all contacts have a company |
ORG_LATEST | INSIGHTS_LATEST | org.RBID = insights.RBID_ORG | LEFT JOIN | All insights are company-level |
PER_LATEST | INSIGHTS_LATEST | per.RBID_ORG = insights.RBID_ORG | LEFT JOIN | Get company-level insights for contacts |
PER_LATEST | HISTORICAL_EXPERIENCE_LATEST | per.LINKEDIN_URL = he.linkedin_url | LEFT JOIN | One profile per LinkedIn URL |
Common join patterns
Contacts with company info
The most common join — enriching contacts with their company’s firmographic data:Use
LEFT JOIN (not INNER JOIN) if you want to include contacts that don’t have a company record. Use INNER JOIN if you only want contacts with a known company.Contacts with company-level insights
Full join: contacts + companies + insights
Contacts with historical experience
Historical experience uses an array structure. Use
LATERAL FLATTEN to work with individual positions. See Historical Experience for details.Gotchas and tips
NULL RBID_ORG
NULL RBID_ORG
Not every contact has a linked company. If you use
INNER JOIN on ORG_LATEST, you’ll silently drop those contacts. Use LEFT JOIN unless you specifically want to exclude unmatched contacts. Check for RBID_ORG IS NULL to see how many contacts lack company associations.All emails are valid
All emails are valid
All emails in the dataset are verified as valid. You don’t need to filter on
EMAIL_STATUS = 'VALID' — if an email exists in the dataset, it’s valid. Use EMAIL_LAST_VERIFIED_AT to prioritize recently verified addresses.Insights are company-level only
Insights are company-level only
All insights are company-level only. When joining insights to contacts, you get the company-level insights associated with the contact’s company (
RBID_ORG). There are no contact-level insights.Historical experience array structure
Historical experience array structure
The historical experience table stores one row per LinkedIn profile with a
jobs array. Use LATERAL FLATTEN to work with individual positions. See Historical Experience for examples.Performance on large joins
Performance on large joins
When joining across large tables, always include filter conditions (
WHERE clauses) to reduce the working set before the join. Filtering on EMAIL_LAST_VERIFIED_AT, INDUSTRY_LINKEDIN, or EMPLOYEE_COUNT_MAX early will significantly speed up queries.Pre-joined tables
Pre-joined tables
For common combinations (people + companies, or people + companies + insights), consider using pre-joined tables like
VELOCITY_BASE_UNLIMITED_LATEST or VELOCITY_ENHANCED_UNLIMITED_LATEST instead of writing joins yourself. See Pre-Joined Tables for details.Joining with your own data
You can also join RevenueBase tables with your own internal data in Snowflake. The most common approach is matching ondomain:
