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

Reply via email to