SQL Non Equi Join
NON EQUI JOIN
The SQL NON EQUI JOIN uses comparison operator instead of the equal sign like >, <, >=, <= along with conditions.
Visual presentation of SQL Non Equi Join:
Syntax:
SELECT * FROM table_name1, table_name2 WHERE table_name1.column [> | < | >= | <= ] table_name2.column;
Example:
Here is an example of non equi join in SQL between two tables
Sample table: ordersORD_NUM ORD_AMOUNT ADVANCE_AMOUNT ORD_DATE CUST_CODE AGENT_CODE ORD_DESCRIPTION ---------- ---------- -------------- --------- --------------- --------------- ----------------- 200114 3500 2000 15-AUG-08 C00002 A008 200122 2500 400 16-SEP-08 C00003 A004 200118 500 100 20-JUL-08 C00023 A006 200119 4000 700 16-SEP-08 C00007 A010 200121 1500 600 23-SEP-08 C00008 A004 200130 2500 400 30-JUL-08 C00025 A011 200134 4200 1800 25-SEP-08 C00004 A005 200108 4000 600 15-FEB-08 C00008 A004 200103 1500 700 15-MAY-08 C00021 A005 200105 2500 500 18-JUL-08 C00025 A011 ..............Sample table : customer
+-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+ |CUST_CODE | CUST_NAME | CUST_CITY | WORKING_AREA | CUST_COUNTRY | GRADE | OPENING_AMT | RECEIVE_AMT | PAYMENT_AMT |OUTSTANDING_AMT| PHONE_NO | AGENT_CODE | +-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+ | C00013 | Holmes | London | London | UK | 2 | 6000.00 | 5000.00 | 7000.00 | 4000.00 | BBBBBBB | A003 | | C00001 | Micheal | New York | New York | USA | 2 | 3000.00 | 5000.00 | 2000.00 | 6000.00 | CCCCCCC | A008 | | C00020 | Albert | New York | New York | USA | 3 | 5000.00 | 7000.00 | 6000.00 | 6000.00 | BBBBSBB | A008 | | C00025 | Ravindran | Bangalore | Bangalore | India | 2 | 5000.00 | 7000.00 | 4000.00 | 8000.00 | AVAVAVA | A011 | | C00024 | Cook | London | London | UK | 2 | 4000.00 | 9000.00 | 7000.00 | 6000.00 | FSDDSDF | A006 | | C00015 | Stuart | London | London | UK | 1 | 6000.00 | 8000.00 | 3000.00 | 11000.00 | GFSGERS | A003 | | C00002 | Bolt | New York | New York | USA | 3 | 5000.00 | 7000.00 | 9000.00 | 3000.00 | DDNRDRH | A008 | | C00018 | Fleming | Brisban | Brisban | Australia | 2 | 7000.00 | 7000.00 | 9000.00 | 5000.00 | NHBGVFC | A005 | | C00021 | Jacks | Brisban | Brisban | Australia | 1 | 7000.00 | 7000.00 | 7000.00 | 7000.00 | WERTGDF | A005 | | C00019 | Yearannaidu | Chennai | Chennai | India | 1 | 8000.00 | 7000.00 | 7000.00 | 8000.00 | ZZZZBFV | A010 | ........... +-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+
To get order number and order amount columns from orders table aliased as 'a' and customer name and working area columns from customer table aliased as 'b' after joining said two tables with the following condition -
1. order amount of orders table matches any of the opening amounts of customer table,
the following SQL statement can be used:
SQL Code:
-- Selecting columns ord_num, ord_amount, cust_name, and working_area from tables orders and customer
SELECT a.ord_num, a.ord_amount, b.cust_name, b.working_area
-- Specifying the tables involved in the query and their aliases
FROM orders a, customer b
-- Filtering the rows where the ord_amount is between the opening_amt and opening_amt (redundant condition)
WHERE a.ord_amount BETWEEN b.opening_amt AND b.opening_amt;
Explanation:
- This SQL query retrieves specific information from the tables orders and customer.
- It selects four columns: ord_num and ord_amount from the orders table (aliased as a), and cust_name and working_area from the customer table (aliased as b).
- The query performs an implicit join between the orders and customer tables, combining all rows from both tables.
- It then applies a condition using the WHERE clause, specifying that the ord_amount from the orders table must be between the opening_amt and opening_amt from the customer table.
- However, this condition is redundant as it always evaluates to true (any value is between itself and itself).
- The result will likely include all orders along with the names of customers and their working areas, but the condition doesn't filter the data as intended.
Output:
ORD_NUM ORD_AMOUNT CUST_NAME WORKING_AREA --------- ---------- ---------------------------------------- ------------- 200110 3000 Micheal New York 200101 3000 Micheal New York 200108 4000 Cook London 200119 4000 Cook London 200113 4000 Cook London 200108 4000 Karl London 200119 4000 Karl London 200113 4000 Karl London
Key points to remember
Click on the following to get the slides presentation -
Here is a new document which is a collection of questions with short and simple answers, useful for learning SQL as well as for interviews.
Check out our 1000+ SQL Exercises with solution and explanation to improve your skills.
Previous: SQL EQUI JOIN
Next: SQL INNER JOIN
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics