Обсуждение: A simple join question that may stump you

Поиск
Список
Период
Сортировка

A simple join question that may stump you

От
nospam4@pobox.com (Ross Smith)
Дата:
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.


Re: A simple join question that may stump you

От
prinsarian@zonnet.nl (A. Prins)
Дата:
This is one way that comes up:

select id
from 
(    select distinct a.id AS id                        , b.flag AS flag    from A, B    where a.flag = b.flag
) a_distinct
where id not in   (select id from a where flag not in (select flag from b))
group by id
having count(*) = (select count(*) from b)
;


Arian.

On 25 Sep 2001 20:01:06 -0700, nospam4@pobox.com (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.

Arian Prins / Rock Resort
--U-N-L-E-A-S-H-E-D--
(keyboards/production/songwriting)
listen at: http://www.mp3.com/RockResort


Re: A simple join question that may stump you

От
"Josh Berkus"
Дата:
Ross,

>    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

Try looking at the INTERSECT and EXCEPT join types.  Thus, in pseudo-sql
you'd need:

SELECT A.ID
WHERE Count A JOIN B = Count B
AND Count A EXCEPT B = 0

Assuming that all rows in A are unique.

-Josh


______AGLIO DATABASE SOLUTIONS___________________________
                                       Josh Berkus
  Complete information technology      josh@agliodbs.com
   and data management solutions       (415) 565-7293
  for law firms, small businesses        fax 621-2533
    and non-profit organizations.      San Francisco

Вложения