Mode disclosure
All modes use one coherent workspace; only disclosure and guidance change. Learn mode keeps theory, concept names, full schema help, progressive hints, and solution review available.
INNER JOIN and Qualified Columns / write query
M17-A06 - Joined filter - separate relationship condition from a status filter
M17-A06 - Joined filter - separate relationship condition from a status filter. Combine matching rows on verified keys with readable aliases and qualified references.
- Result grain
- one completed order row with customer context
- Exact columns
- order_id; customer_name; status
SQL editor shortcuts: Ctrl or Command Enter runs the query, Ctrl or Command Shift Enter checks it, Alt H opens the next hint, Ctrl or Command slash toggles a line comment, Ctrl or Command Shift F formats the SQL, and Escape closes transient UI.
Cursor at line 1, column 1.
Scenario
Write inner joins on verified keys: complete ON conditions, predict one-to-many output, qualify ambiguous columns, repair wrong ID joins, and preserve line-item grain.
INNER JOIN and Qualified Columns / write query
One-sentence task
M17-A06 - Joined filter - separate relationship condition from a status filter. Combine matching rows on verified keys with readable aliases and qualified references.
Learn mode disclosure
Theory, concept names, full schema help, and progressive hints are available.
Structured output contract
- Result grain
- one completed order row with customer context
- Exact columns
- order_id; customer_name; status
- Source population
- Use the prompt setup plus FROM, JOIN, WHERE, and subquery predicates as the source population. Visible rows are only examples.
- Grouping
- Do not collapse rows unless the contract explicitly asks for aggregation, distinct tuples, or set semantics.
- Ordering
- return order_id; order by order_id
- Validation
- select-only; hidden deterministic variants.
Relevant tables
Time and difficulty
- Estimated time
- 10 minutes
- Difficulty
- 4/5
Objective and concepts
Debug the requested SQL output contract for inner join and qualified columns using source grain, columns, ordering, and edge-case evidence.
Glossary links
Concept material
SQL Trail treats every query as an evidence trail: identify source grain, transform rows deliberately, then compare output to a shared contract.
A passing query must handle hidden nulls, ties, boundaries, and no-match rows when the contract makes them relevant.
Syntax card
SELECT <requested_columns>
FROM <source_table>
WHERE <source_population_filter>
GROUP BY <result_grain_columns>
ORDER BY <deterministic_tie_breakers>;- <requested_columns> means the exact output columns, aliases, and order from the visible contract.
- <source_population_filter> means the row population definition, not a copied visible-row value.
- <deterministic_tie_breakers> means all ordering and tie rules needed for repeatable output.
Why this works
Both tables expose customer_id, so qualify the source and alias the output to avoid ambiguity.
Edge cases
Hidden variants preserve nulls, ties, duplicates, boundaries, no-match rows, and alternate row order when those risks apply.
PostgreSQL note
The local engine uses PostgreSQL-compatible syntax, including explicit NULL predicates, deterministic ORDER BY clauses, and transactional grading.
Worked example
SELECT o.order_id, o.customer_id AS order_customer_id, c.customer_name FROM orders o JOIN customers c ON c.customer_id = o.customer_id ORDER BY o.order_id;Assumptions, dialect notes, and common traps
- Duplicate policy
- Preserve duplicate facts unless the prompt explicitly asks for distinct tuples or set semantics.
- Null policy
- Preserve NULL, empty string, zero, and false as distinct values unless the contract says to display a fallback.
- Tie-breakers
- Use every ordering rule in the contract and end tied business metrics with deterministic secondary keys when needed.
- Zero-related entities
- Do not invent zero rows unless the contract asks for preserved parents, missing entities, or complete periods.
- Numeric tolerance
- Use exact semantic comparison unless the activity explicitly declares a numeric tolerance.
PostgreSQL-compatible local checks
Queries run in a local PGlite worker with PostgreSQL-style syntax and transactional grading.
- ON needs the real foreign key: The join condition pairs similarly named primary keys instead of the child foreign key. Repair: Use the verified relationship from the schema: child foreign key to parent primary key.
- One-to-many rows are expected repeats: Repeated parent labels in a joined result are treated as duplicates to remove. Repair: Name the output grain; parent values repeat when each child row is still represented.
- Ambiguous columns need table aliases: A shared column name is selected without qualification after joining tables. Repair: Qualify source columns with table aliases and add readable output aliases when needed.
- Relationship and row filters are different: A status rule is mixed into the join condition and the path becomes hard to audit. Repair: Put key relationships in ON and row filters in WHERE for inner joins.
Opened hints
No hints opened yet.