Learn SQL/Intermediate/Joins/SQL JOIN Using ON

SQL JOIN Using ON

The ON keyword explicitly states the join condition — the modern, standard, and clearest way to write any join.

What & Why

Every join example so far has used ON to state the matching condition directly, right where the join is written: JOIN table2 ON table1.col = table2.col. This keeps the join logic and the join itself together in one place.

See How It Works

BUSINESS QUESTION

Marketing attaches each lead to its campaign through the declared campaign foreign key.

idcampaign_idemailcreated_atqualified_atconverted_atlead_scoresourcecountry
3011ana@example.com2024-01-21 09:10:00+002024-01-22 11:00:00+002024-02-02 10:00:00+0086google_adsUS
3021ben@example.com2024-01-24 12:40:00+00NULLNULL52google_adsCA
3032chloe@example.com2024-02-16 08:30:00+002024-02-18 14:20:00+00NULL74emailGB
3043dev@example.com2024-03-20 17:15:00+002024-03-21 09:00:00+002024-04-04 16:00:00+0091linkedinUS
idnamechannelspendstart_dateend_datestatustarget_segment
1Spring Launchgoogle_ads55000.002024-01-152024-03-31activesmb
2Retention Webinaremail45000.002024-02-102024-04-15activeenterprise
3Finance Retargetinglinkedin50000.002024-03-122024-05-31activeenterprise
4Enterprise Searchgoogle_ads60000.002024-04-012024-06-30activeenterprise
EXAMPLE QUERY
SELECT
  l.id AS lead_id,
  c.name AS campaign_name,
  l.source
FROM marketing.leads l
JOIN marketing.campaigns c
  ON c.id = l.campaign_id
ORDER BY lead_id;
RESULT — exact output from the displayed Queryflo rows
lead_idcampaign_namesource
301Spring Launchgoogle_ads
302Spring Launchgoogle_ads
303Retention Webinaremail
304Finance Retargetinglinkedin

ON follows the real leads.campaign_id to campaigns.id relationship.

Now You Try

Practice this concept

Marketing wants converted leads with their campaign name and lead source.

Available schema
marketing

Prefix tables with marketing.table_name.

lead_idcampaign_namesource
marketing.campaigns
ColumnType
idinteger
nametext
channeltext
spendnumeric
start_datedate
end_datedate
statustext
target_segmenttext
legacy_idtext
marketing.leads
ColumnType
idinteger
campaign_idinteger
emailtext
created_attimestamp with time zone
qualified_attimestamp with time zone
converted_attimestamp with time zone
lead_scoreinteger
sourcetext
countrytext
archive_statustext
query.sql
Intermediate business practice

Sign up free to try it on a real business scenario