Learn SQL/Advanced/Subqueries/SQL NOT IN with a Subquery

SQL NOT IN with a Subquery

The mirror image of IN — and the one place a single NULL can break your whole query.

What & Why

NOT IN (subquery) keeps an outer value only when it differs from every known value returned by the one-column subquery. It is concise for anti-membership, but nullable subquery values must be removed or the predicate can become UNKNOWN for every candidate.

See How It Works

BUSINESS QUESTION

Marketing wants campaigns whose IDs never appear on a lead.

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
EXAMPLE QUERY
SELECT
  c.id AS campaign_id,
  c.name
FROM marketing.campaigns c
WHERE c.id NOT IN (
  SELECT l.campaign_id
  FROM marketing.leads l
  WHERE l.campaign_id IS NOT NULL
)
ORDER BY campaign_id;
RESULT — campaign IDs absent from leads
campaign_idname
4Enterprise Search

The lead table contains campaign IDs 1, 2, and 3, leaving campaign 4.

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario