[pgsql-jp: 29839] Re: intersectの使い方に関して

Takeshi Miyakawa tak @ hdt.co.jp
2003年 5月 10日 (土) 17:50:37 JST


 みやかわ@ホビー・データです。

Nobuo Nishino wrote:
>create table test
>(
>     key		integer,
>     value	varhar(100),
>)
>
>以上のようなテーブルがありデータは以下のようなデータがあるとします。
>
>| key | value |
>|   1 |     a |
>|   1 |     b |
>|   2 |     b |
>|   2 |     d |
>|   2 |     e |
>|   3 |     a |
>|   3 |     b |
>|   3 |     e |
>
>このようなデータがあるときに
>SELECT key FROM test WHERE value = 'a'
>intersect
>SELECT key FROM test WHERE value = 'b'
>と、SQLを実行した結果レコード件数が0件となってしまいます。
>(実際にはレコード件数2件でkey = 1と3が戻ると思うのですが )
 戻りません。

 query_a INTERSECT query_b

 という形式は、query_aとquery_bの双方に現れる「行」を返します。

 このケースでは、SELECT key FROM test WHERE value = 'a' は、
|   1 |     a |
|   3 |     a |

の2行を返します。
 一方、SELECT key FROM test WHERE value = 'b'は、

|   1 |     b |
|   2 |     b |
|   3 |     b |

の3行を返します。
 前者と後者に重複する行はありませんから、INTERSECTは何も戻さ
ないのです。

 ご希望の動作を実現するには、以下のように書くことになるかと思います。

SELECT key
  FROM test
 WHERE value = 'a' AND
       key IN (SELECT key
                 FROM test
                WHERE value = 'b');
 





pgsql-jp メーリングリストの案内