N029-H2 Tier 3 · Intermediate · hard hr · Helix Systems

Return each employee alongside the title of any matching job history entry

Part of NULL Handling in Joins and Aggregates in SQL

The problem

Helix Systems' HR team is auditing career progression and needs a list of every employee alongside any job history entry where the role held was 'Account Executive'.

Write a query to return each employee alongside the title of any matching job history entry.

Assumptions:

  • A matching entry is one whose title is exactly 'Account Executive'.
  • Every employee must appear. Employees with no matching entry contribute a single row with a missing title. No current Helix Systems employee has an 'Account Executive' entry on record, so every output row will have a missing title.

Output:

  • One row per employee, with columns name and title.
Schema · hr 4 tables
departments
id integer
name text
location text
budget numeric
salaries
id integer
employee_id integer
amount numeric
effective_date date
end_date? date
employees
id integer
name text
email text
department_id integer
manager_id? integer
hire_date date
title text
is_active boolean
job_history
id integer
employee_id integer
title text
department_id integer
start_date date
end_date? date

Run previews · Check grades

Write a query, then run it to see results here.

Worked solution Try it yourself first
Solution query
SELECT
  e.name,
  jh.title
FROM
  employees e
  LEFT JOIN job_history jh ON e.id = jh.employee_id
  AND jh.title = 'Account Executive'

The shape

The 'Account Executive' predicate sitting in the ON clause is what guarantees every employee appears in the result. The matching rule never holds for any employee in the data — no one currently at Helix Systems has an 'Account Executive' entry on record — so every output row has title missing, but every employee still has their row.

Clause by clause

  • SELECT e.name, jh.title returns each employee's name alongside the title of any matching job-history entry. On this data, jh.title is missing on every output row because the join attaches nothing for any employee.
  • FROM employees e LEFT JOIN job_history jh ON e.id = jh.employee_id AND jh.title = 'Account Executive' pairs each employee with their 'Account Executive' entries. The ON clause carries two conjoined conditions: the employee-to-history link, and the title restriction. Hope Ivers, Lane Moore, and Mark Nash all have a matched row attached (their title reads 'Account Executive'); every other employee appears with title missing because no qualifying history entry exists.

Why this and not WHERE jh.title = 'Account Executive'

A WHERE filter on jh.title would collapse the result to only the three employees with an 'Account Executive' entry. The other employees — those with no qualifying entry — would have jh.title set to missing by the unmatched-row placeholder, and NULL = 'Account Executive' is not true. Those rows would fail the filter. The audit asked for every employee, so the predicate has to stay in ON where it controls matching rather than in WHERE where it controls survival.

The trap

When the right-side condition never holds for anyone, the ON-versus-WHERE distinction is the only thing standing between a full-employee output and an empty one. The ON version returns one row per employee with title uniformly missing — the audit signal that nobody currently at Helix has an 'Account Executive entry. The WHERE version would return an empty result, which looks like a query that produced nothing rather than an audit that produced a clear negative finding. Picking the right placement is what turns a no-match scenario from "no output" into "every left row, all with missing right-side" — and the second is what the audit needed.

You practiced moving an equality condition into the ON clause — when the right-side value never matches anywhere, every left record still appears with the right columns uniformly missing.

How you actually get good at SQL

Reading explains SQL. Writing it, over and over with instant feedback, is what makes you fluent.

That's the whole SQLMaxx loop: 600+ real problems, instant AI feedback, mastery you can actually see, and spaced review that won't let you forget.

A stack of SQL practice problem cards, the top card showing an employees table.
615 problems · 66 concepts

Real problems. Not toy examples.

615 hand-built problems spanning all 66 concepts, from basic SELECTs to window functions, built on real schemas and real business questions, the kind you'll actually get asked on the job. Enough reps to make SQL automatic.

A retro computer showing a SQL query marked correct with a green checkmark.
Instant AI feedback

Write a query. Know if it's right in one second.

No copying an answer and hoping it clicked. The AI grader checks your real query against real data, catches exactly what's wrong, and explains the fix in plain English, like a senior analyst reading over your shoulder on every problem.

A circular mastery progress dial filling from blue to green, the SQLMaxx diamond at its center.
Mastery tracking

Stop guessing whether you actually know it.

SQLMaxx tracks every concept and shows you what you've mastered and what's still shaky. Your skills fill in one concept at a time, so 'I think I get joins' becomes something you can prove.

A SQL query editor circled by a blue return arrow with a clock, scheduled to come back for review.
Spaced review

Learn it once. Keep it for good.

Most of what you learn this week fades by next week. So when a concept comes due for review, SQLMaxx hands you a fresh problem to solve from a blank editor, not a flashcard to re-read. A research-backed spaced-repetition algorithm (FSRS) times each return for right before you'd forget, so your SQL is still there months later, when the interview or the job actually needs it.

Practice, feedback, mastery, review. That's the loop that turns reading into real skill.

Start free

No account, no credit card. Start solving in under a minute.