Left join with condition

stej picture stej · Feb 6, 2012 · Viewed 43.2k times · Source

Suppose I have these tables

create table bug (
    id int primary key, 
    name varchar(20)
)
create table blocking (
    pk int primary key,
    id int, 
    name varchar(20)
)

insert into bug values (1, 'bad name')
insert into bug values (2, 'bad condition')
insert into bug values (3, 'about box')
insert into blocking values (0, 1, 'qa bug')
insert into blocking values (1, 1, 'doc bug')
insert into blocking values (2, 2, 'doc bug')

and I'd like to join the tables on id columns and the result should be like this:

id          name                 blockingName
----------- -------------------- --------------------
1           bad name             qa bug
2           bad condition        NULL
3           about box            NULL

This means: I'd like to return all rows from #bug there should be only 'qa bug' value in column 'blockingName' or NULL (if no matching row in #blocking was found)


My naive select was like this:

select * from #bug t1 
    left join #blocking t2 on t1.id = t2.id
    where t2.name is null or t2.name = 'qa bug'

but this does not work, because it seems that the condition is first applied to #blocking table and then it is joined.

What is the simplest/typical solution for this problem? (I have a solution with nested select, but I hope there is something better)

Answer

samjudson picture samjudson · Feb 6, 2012

Simply put the "qa bug" criteria in the join:

select t1.*, t2.name from #bug t1 
left join #blocking t2 on t1.id = t2.id AND t2.name = 'qa bug'