Я почти уверен, что объединение даже не делает то, что вы хотите. Если в таблице a имеется 100 записей с нулевым значением qid и 100 записей в таблице b с нулевым значением qid, объединение в том виде, в котором оно было записано, должно создать перекрестное соединение и дать 10000 результатов для этих записей. Если вы посмотрите на следующий код и запустите примеры, я думаю, что последний, вероятно, больше того набора результатов, который вы намеревались:
create table #test1 (id int identity, qid int)
create table #test2 (id int identity, qid int)
Insert #test1 (qid)
select null
union all
select null
union all
select 1
union all
select 2
union all
select null
Insert #test2 (qid)
select null
union all
select null
union all
select 1
union all
select 3
union all
select null
select * from #test2 t2
join #test1 t1 on t2.qid = t1.qid
select * from #test2 t2
join #test1 t1 on isnull(t2.qid, 0) = isnull(t1.qid, 0)
select * from #test2 t2
join #test1 t1 on
t1.qid = t2.qid OR ( t1.qid IS NULL AND t2.qid IS NULL )
select t2.id, t2.qid, t1.id, t1.qid from #test2 t2
join #test1 t1 on t2.qid = t1.qid
union all
select null, null,id, qid from #test1 where qid is null
union all
select id, qid, null, null from #test2 where qid is null