電子書籍の厳選無料作品が豊富!

下記のテーブルがあったとし、field3に「2」と「4」が入っているfield2の値を抽出したいと思いました。
下記の場合ですと、その条件を満たすのは11のみの為、「11」と表示したいと思います。

【T_Mテーブル】
―――――――――――――
|field1|field2|field3|
―――――――――――――
|1  |11  |1   |
|2  |11  |2   |
|3  |11  |3   |
|4  |11  |4   |
|5  |12  |2   |
|6  |12  |3   |
|7  |13  |3   |
|8  |13  |4   |
―――――――――――――

その為、下記のようなSQLを発行しましたが、1件もヒットしませんでした。

SELECT T_M.field2
FROM T_M
WHERE T_M.field3=2 And T_M.field3=4
GROUP BY T_M.field2;

WHERE T_M.field3=2 And T_M.field3=4に問題があると思うのですが、
And の代わりに or を使用すると、「11」「12」「13」がヒットしてしまい、
「11」だけをヒットさせることが出来ませんでした。

その為、上記のテーブル内容で「11」が返ってくるSQLの書き方についてご教示いただければと思います。

A 回答 (4件)

その他データベースに投稿される場合、使っているデータベースを書かれた方がよいと思います。


DBMS特有の関数や構文を示すことができませんので。。
考え方は以下の通りです。
・データのField2が「Field3=2であるField2」と「Field3=4であるField2」の両方を満たす
SELECT field2
FROM T_M
WHERE field2 IN (SELECT field2 FROM T_M WHERE Field3=2)
And field2 IN (SELECT field2 FROM T_M WHERE Field3=4)
GROUP BY field2
・データを集計したときにfield2=2のデータとfield2=4のデータをそれぞれ1件以上含む
SELECT field2
FROM T_M
GROUP BY field2
Having SUM(CASE WHEN field3=2 Then 1 Else 0 End)>0
Or SUM(CASE WHEN field3=4 Then 1 Else 0 End)>0

しかし、後者で使われているCASE式はたとえばAccessでは使えませんのでIIFなどを使う必要があります。
    • good
    • 0
この回答へのお礼

ありがとうございます。

使用しているDBですが、ローカルでは手っ取り早く試せるということでAccessを使用しております。
そしてウェブ上で使用しているDBはpostgresqlとなります。

前者がAccessで動作することを確認いたしました。
後者はAccessで下記のように修正した所、動作しているようでした。
SELECT T_M.field2
FROM T_M
GROUP BY T_M.field2
HAVING (((Sum(IIf([field3]=2,1,0)))>0) AND ((Sum(IIf([field3]=4,1,0)))>0));

また後者については教えていただいたソースがPostgresqlで動作いたしました。
また、どちらのソースもいろいろ検索してみて、どういう事を行っているか理解できたと思います。

どうもありがとうございました。

お礼日時:2008/10/13 00:49

>T_MとAは同じ物のため、それを比較する意味が分かりませんでした。


Field2が同じでfield3の条件を満たすものを見つけるために
同じものを別の名前で参照します

>Postgresqlに移植を試みましたが、失敗しました。
Existsはどのデータベースでも使えると思います
別名を付けるときにはAsを使わず単にスペースで区切るだけの書き方の方がメジャーかな
    • good
    • 0
この回答へのお礼

ご説明いただきましてありがとうございます。
実は大変申し訳ないのですが、いまだに理解できておりません。
多分Postgresqlへの移植がうまくいかなかったのもExistsの使い方に対する理解不足が原因と思います。
その為、今後Existsの使い方を理解を深めてまいりたいと思います。
どうもありがとうございました。

お礼日時:2008/10/14 00:08

SELECT distinct T_M.field2


FROM T_M
where
Exists (select * from T_M as A where A.field2=T_M.field2 and field3=2)
And
Exists (select * from T_M as A where A.field2=T_M.field2 and field3=4)
    • good
    • 0
この回答へのお礼

ありがとうございます。

Accessで動作することを確認いたしました。
ただ、SQL文の意味は理解できませんでした(T_M as A where A.field2=T_M.field2と記載されており、T_MにAという別名をつけ、A.field2とT_M.field2を比較しているようですが、T_MとAは同じ物のため、それを比較する意味が分かりませんでした。この部分を省くと正常に動作しなくなるので必須の記述だという事はわかったのですが)。

それとPostgresqlに移植を試みましたが、失敗しました。
Postgresqlで書いているSQLはもう少し長い文のため、上記の記述の意味が理解できていない為、失敗したのかも知れません。

なおSQL文自体は規則性があり見やすくて良いなと思いました。

お礼日時:2008/10/13 00:57

#1です。

書き間違えたので訂正します。
後者のケースはOrでなく、Andです。失礼しました。

SELECT field2
FROM T_M
GROUP BY field2
Having SUM(CASE WHEN field3=2 Then 1 Else 0 End)>0
And SUM(CASE WHEN field3=4 Then 1 Else 0 End)>0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!