SQL Non-Equi JOIN
Any join whose condition uses something other than = — the general family the JOINs with Comparison Operators lesson introduced, now named explicitly.
What & Why
"Non-equi join" is simply the name for any join whose ON condition doesn't use plain equality — >, <, >=, <=, or != all qualify. It's a category label for the comparison-operator technique from two lessons ago, not a different SQL keyword.
See How It Works
BUSINESS QUESTION
SaaS finance matches each account to invoices whose amount is at least that account's MRR.
| id | name | plan | mrr | created_at | churned_at | country | employee_count | industry |
|---|---|---|---|---|---|---|---|---|
| 1 | Acme Labs | growth | 240.00 | 2024-01-08 10:00:00+00 | NULL | US | 45 | software |
| 2 | Northstar Co | starter | 90.00 | 2024-02-12 09:30:00+00 | 2024-05-18 12:00:00+00 | CA | 18 | services |
| 3 | Atlas Works | scale | 480.00 | 2024-03-04 15:10:00+00 | NULL | GB | 120 | manufacturing |
| 4 | Bright Path | growth | 180.00 | 2024-04-19 11:45:00+00 | NULL | US | 62 | education |
| id | account_id | amount | status | due_date | paid_at |
|---|---|---|---|---|---|
| 10 | 1 | 240.00 | paid | 2024-02-01 | 2024-01-29 13:00:00+00 |
| 11 | 1 | 260.00 | paid | 2024-03-01 | 2024-02-28 16:30:00+00 |
| 12 | 2 | 90.00 | overdue | 2024-03-15 | NULL |
| 13 | 3 | 480.00 | open | 2024-04-01 | NULL |
EXAMPLE QUERY
SELECT
a.name,
a.mrr,
i.id AS invoice_id,
i.amount
FROM saas.accounts a
JOIN saas.invoices i
ON i.account_id = a.id
AND i.amount >= a.mrr
ORDER BY a.name, invoice_id;RESULT — exact output from the displayed Queryflo rows
| name | mrr | invoice_id | amount |
|---|---|---|---|
| Acme Labs | 240.00 | 10 | 240.00 |
| Acme Labs | 240.00 | 11 | 260.00 |
| Atlas Works | 480.00 | 13 | 480.00 |
| Northstar Co | 90.00 | 12 | 90.00 |
The account key matches first; the inequality then keeps invoices meeting MRR.
Now You Try
Practice this concept
SaaS finance wants invoices whose amount is at least the MRR of their own account.
Available schema
saasPrefix tables with saas.table_name.
account_namemrrinvoice_idamountsaas.accounts| Column | Type |
|---|---|
| id | integer |
| name | text |
| plan | text |
| mrr | numeric |
| created_at | timestamp with time zone |
| churned_at | timestamp with time zone |
| country | text |
| employee_count | integer |
| industry | text |
| customer_segment_v2 | text |
saas.invoices| Column | Type |
|---|---|
| id | integer |
| account_id | integer |
| amount | numeric |
| status | text |
| due_date | date |
| paid_at | timestamp with time zone |
| internal_invoice_batch | text |
query.sql
Sign up free to try it on a real business scenario