How about:- SELECT id FROM (a LEFT JOIN b WHERE a.flag=b.flag) GROUP BY id HAVING ((COUNT(*)=COUNT(b.flag)) AND (COUNT(*)=(SELECT COUNT(*) FROM b AS b_cnt)));
This relys on COUNT(field) not counting NULLs, and that NULL is what the LEFT JOIN returns for an absent b.flag:- ID a.FLAG b.FLAG ----- ------ ------ 1 1 1 2 1 1 2 2 2 3 1 1 3 2 2 3 3 NULL 4 1 1 4 3 NULL N.B In your test table you missed the case of having some, but not all of b's flags and one or more others... ID FLAG ----- ----- 4 1 4 3 Ross Smith wrote: > > OK, I have 2 tables, table A: > > ID FLAG > ----- ----- > 1 1 > 2 1 > 2 2 > 3 1 > 3 2 > 3 3 > > and table B: > > FLAG > ----- > 1 > 2 > > I want to find all id's from table A that have every flag in table B > but no extra flags. So, I'd end up with: > > ID > ----- > 2 > > As id 2 has both flag 1 and flag 2, id 1 doesn't have flag 2, and id 3 > has flag 3. > > I know it can be done, 'cause I've done it in the past, but I've spent > hours on this to no avail. Surfing the net proved fruitless as well. > > Any help would be greatly appreciated. -- This is the identity that I use for NewsGroups. Email to this will just sit there. If you wish to email me replace the domain with knightpiesold . co . uk (no spaces). ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster