SQL CROSS JOIN

Every row from one table paired with every row from the other — no matching condition at all, deliberately.

What & Why

CROSS JOIN produces every possible combination of its two inputs, with no ON condition. Pairing every marketing.campaigns row with every distinct lead country creates a complete campaign-by-market planning grid, and its row count is the two input counts multiplied together.

See How It Works

BUSINESS QUESTION

Marketing wants a planning grid containing every campaign and every country currently represented by its leads.

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
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
Trace the relationship row by row1× speed
marketing.campaigns
idname
1Spring Launch
2Retention Webinar
3Finance Retargeting
4Enterprise Search
PAIR EVERY ROW
DISTINCT marketing.leads.country
country
CA
GB
US
Result set · 1 rows
campaign_namecountry
Enterprise SearchCA

Enterprise Search and CA become one result row. Four campaigns × three stored countries produces twelve rows.

EXAMPLE QUERY
SELECT
  c.name AS campaign_name,
  markets.country
FROM marketing.campaigns c
CROSS JOIN (
  SELECT DISTINCT country
  FROM marketing.leads
  WHERE country IS NOT NULL
) markets
ORDER BY campaign_name, country;
Now You Try

Practice this concept

Marketing wants every campaign paired with every country represented by its leads.

Available schema
marketing

Prefix tables with marketing.table_name.

campaign_namecountry
marketing.campaigns
ColumnType
idinteger
nametext
channeltext
spendnumeric
start_datedate
end_datedate
statustext
target_segmenttext
legacy_idtext
query.sql
Intermediate business practice

Sign up free to try it on a real business scenario