Equi-Join (Inner Join)
This is part 2 of a multi-part series on the SQL Join. For an introduction to the whole topic, take a look at:
What Is A Join: Part 1.
This time I'm going to talk about the Equi-Join, also called an Inner Join. An equi-join combines records from two tables which have common values in both tables and displays only those with matching records. Since an equi-join is the most common type of join, it is often simply referred to as a Join.
Consider the following Order and OrderDetail table
Orders | |
OrderID | OrderNumber |
1 | 111 |
2 | 222 |
3 | 333 |
4 | 444 |
OrderDetails | ||
OrderDetailID | OrderID | Quantity |
1 | 1 | 1 |
2 | 2 | 2 |
5 | 3 | 3 |
6 | 1 | 2 |
7 | 1 | 1 |
8 | 3 | 2 |
9 | 3 | 1 |
Joining them on the OrderID field results in:
Single Join Query | ||
OrderNumber | OrderID | Quantity |
111 | 1 | 1 |
111 | 1 | 2 |
111 | 1 | 1 |
222 | 2 | 2 |
333 | 3 | 3 |
333 | 3 | 2 |
333 | 3 | 1 |
Notice that although the Orders table has a record for Order Number 444, it does not display in Single Join Query. That's because there are no matching records in OrderDetails. An equi-join shows only those records with matching values in both tables.
The SQL for this query is:
SELECT Orders.OrderNumber, OrderDetails.OrderID, OrderDetails.Quantity
FROM Orders INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID;
In the Query Builder, it looks like this:
Notice the 1 and infinity symbol (∞) on the Join line. These indicate that a Relationship exists between these tables and that the OrderID is a Primary Key for the table on the "One-side". This is important, because if you want a query with a join of two tables to be updateable, the field or fields on the "one-side" of the join must either be a Primary Key or a Unique Index. I'll talk more about the updateability of queries in a later post.
Multiple Joins
A query is not limited to a single join. Each join is between just two tables, but the FROM clause of the query can have many joins. For instance, I can add the Products table
Products | |||
ProductID | ProductName | Cost | Price |
1 | hammer | $1.00 | $2.00 |
2 | nail - 10p | $0.01 | $0.02 |
3 | saw | $5.00 | $10.00 |
4 | wrench | $6.00 | $7.00 |
5 | nail - 8p | $0.01 | $0.02 |
6 | drill | $20.00 | $40.00 |
7 | screw - 1x4 | $0.02 | $0.04 |
8 | hammer | $4.00 | $5.00 |
to the above query to get the product and price for the order.
Something like this:
MultipleJoin | ||||
OrderNumber | OrderID | Quantity | ProductName | Price |
111 | 1 | 1 | hammer | $2.00 |
222 | 2 | 2 | nail - 10p | $0.02 |
333 | 3 | 3 | saw | $10.00 |
111 | 1 | 2 | wrench | $7.00 |
111 | 1 | 1 | saw | $10.00 |
333 | 3 | 2 | hammer | $2.00 |
333 | 3 | 1 | saw | $10.00 |
In the Query Builder, it looks like this:
SELECT Orders.OrderNumber, OrderDetails.OrderID, OrderDetails.Quantity, Products.ProductName, Products.Price
FROM Products INNER JOIN
(Orders INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID)
ON Products.ProductID = OrderDetails.ProductID;
Next time, I'll discuss the least common type of join, the Cartesian or Cross Join.
.
No comments:
Post a Comment