N017-E3 Tier 2 · Core SQL · easy ecommerce · Brightlane

Return one row per order line item with the matching product name plus the line's quantity and unit price

Part of INNER JOIN in SQL

The problem

Brightlane's fulfilment team needs a manifest of all order line items, showing the product name, quantity, and unit price for each line.

Write a query to return one row per order line item with the matching product name plus the line's quantity and unit price.

Assumptions:

  • The order_items table contains one row per product per order; product_id on each line points to a row in products.
  • The products table contains every product in the catalogue, identified by products.id.
  • Every line item has a valid product_id.

Output:

  • One row per order line item, with columns product_name, quantity, and unit_price.
Schema · ecommerce 5 tables
categories
id integer
name text
parent_id? integer
products
id integer
name text
category_id integer
price numeric
stock_qty integer
attributes? jsonb
order_items
id integer
order_id integer
product_id integer
quantity integer
unit_price numeric
customers
id integer
name text
email text
city? text
country text
created_at timestamptz
is_active boolean
orders
id integer
customer_id integer
ordered_at timestamptz
status text
total_amount numeric

Run previews · Check grades

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

Worked solution Try it yourself first
Solution query
SELECT
  p.name AS product_name,
  oi.quantity,
  oi.unit_price
FROM
  order_items oi
  JOIN products p ON oi.product_id = p.id

The shape

Each row in order_items represents one product on one order, and the line carries a product_id reference but not the product's name. Joining to products on that reference attaches the catalogue name to every line, so the fulfilment manifest reads as Men's Slim Jeans, 1, 59.99 instead of 42, 1, 59.99.

Clause by clause

  • FROM order_items oi reads from the line-items table and aliases it as oi. Every row here is one product on one order, with quantity and unit_price recorded at the time of purchase and product_id as the link back to the catalogue.
  • JOIN products p ON oi.product_id = p.id pairs each line with its product. For every row in order_items, PostgreSQL finds the row in products whose id equals that line's product_id, and emits a combined row holding both sides. Because every line has a valid product_id, every line item appears in the result.
  • SELECT p.name AS product_name, oi.quantity, oi.unit_price picks the product name from the catalogue side and the per-line quantity and unit price from the line itself. The qualifier on p.name is structural. Both tables carry an id column, and writing oi.product_id = id (without the p.) would be ambiguous. Once the aliases are in place, every column reference reads cleanly: p.name is from products, oi.quantity and oi.unit_price are from the line.

You practiced joining a junction-style fact table (order_items) to one of its parent dimensions (products). The recurring shape: junction tables almost always join to multiple parents; this problem joins to one of them, and joining to the customer/order side later follows the same pattern.

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.