2011-10-12 15:26:00
Using Self-Joins
A table can be joined to itself in a self-join. For example, you can use a self-join to find out the authors in Oakland, California who live in the same ZIP Code area.
Because this query involves a join of the Author table with itself, the Author table appears in two roles. To distinguish these roles, you must give the Author table two different aliases (a1 and a2) in the FROM clause. These aliases are used to qualify the column names in the rest of the query. This is an example of the self-join Transact-SQL statement:
SELECT a1.Firstname,
a1.Lastname,
a2.Firstname,
a2.Lastname
FROM Author a1
INNER JOIN Author a2
ON a1.Zip = a2.zip
WHERE a1.CityId = 'Oakland'
AND a1.StateId = 'CA'
ORDER BY a1.Firstname ASC,
a1.Lastname ASC
Here is the result set:
Firstname Lastname Firstname Lastname ---------- ------------ ---------- ------------ Dean Straight Dean Straight Dean Straight Dirk Stringer Dean Straight Livia Karsen Dirk Stringer Dean Straight Dirk Stringer Dirk Stringer Dirk Stringer Livia Karsen Livia Karsen Dean Straight Livia Karsen Dirk Stringer Livia Karsen Livia Karsen Marjorie Green Marjorie Green Stearns MacFeather Stearns MacFeather (11 row(s) affected)
To eliminate the rows in the results in which the authors match themselves and to eliminate rows that are identical, except the order of the authors is reversed, make this change to the Transact-SQL self-join query:
SELECT a1.Firstname,
a1.Lastname,
a2.Firstname,
a2.Lastname
FROM Author a1
INNER JOIN Author a2
ON a1.Zip = a2.Zip
WHERE a1.CityId = 'Oakland'
AND a1.StateId = 'CA'
AND a1.Id _a_m_p_;_lt; a2.Id
ORDER BY a1.Firstname ASC,
a1.Lastname ASC
Here is the result set:
Firstname Lastname Firstname Lastname ---------- ------------ ---------- ------------ Dean Straight Dirk Stringer Dean Straight Livia Karsen Dirk Stringer Livia Karsen (3 row(s) affected)
It is now clear that Dean Straight, Dirk Stringer, and Livia Karsen all have the same ZIP Code and live in Oakland, California.