Re: A simple join question that may stump you

From: "Thurstan R(dot) McDougle" <trmcdougle(at)my-deja(dot)com>
To: pgsql-sql(at)postgresql(dot)org
Subject: Re: A simple join question that may stump you
Date: 2001-09-26 12:26:52
Message-ID: 3BB1C98C.D45484C3@my-deja.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

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).

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message A. Mannisto 2001-09-26 14:24:41 Subquery with IN or EXISTS
Previous Message A. Prins 2001-09-26 08:11:57 Re: A simple join question that may stump you