下記のテーブルがあったとし、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の書き方についてご教示いただければと思います。
No.1ベストアンサー
- 回答日時:
その他データベースに投稿される場合、使っているデータベースを書かれた方がよいと思います。
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などを使う必要があります。
ありがとうございます。
使用している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で動作いたしました。
また、どちらのソースもいろいろ検索してみて、どういう事を行っているか理解できたと思います。
どうもありがとうございました。
No.4
- 回答日時:
>T_MとAは同じ物のため、それを比較する意味が分かりませんでした。
Field2が同じでfield3の条件を満たすものを見つけるために
同じものを別の名前で参照します
>Postgresqlに移植を試みましたが、失敗しました。
Existsはどのデータベースでも使えると思います
別名を付けるときにはAsを使わず単にスペースで区切るだけの書き方の方がメジャーかな
ご説明いただきましてありがとうございます。
実は大変申し訳ないのですが、いまだに理解できておりません。
多分Postgresqlへの移植がうまくいかなかったのもExistsの使い方に対する理解不足が原因と思います。
その為、今後Existsの使い方を理解を深めてまいりたいと思います。
どうもありがとうございました。
No.3
- 回答日時:
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)
ありがとうございます。
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文自体は規則性があり見やすくて良いなと思いました。
No.2
- 回答日時:
#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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Visual Basic(VBA) 前回質問の続きになりますが、下記マクロでシート1からシート2の抽出項目セルB3「りんご」とセルC2「 2 2022/12/02 17:37
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- Visual Basic(VBA) VBAのフィルター操作 5 2023/08/08 09:48
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- 英語 in the fieldってどういう意味でしょうか? 5 2022/12/10 22:45
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- Excel(エクセル) ExcelVBAについて。 2 2022/12/10 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
field3で特定の値が入っている...
-
1、Rstudioで回帰直線を求める...
-
差し込み後、元データを変更し...
-
for whichの使い方
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
pythonで同じコード内で複数の...
-
SQL
-
SELECT 文 GROUP での1件目を...
-
一つ前のレコードの値と減算し...
-
Access:クエリーにて集計後に...
-
カーソル0件の時にエラーを発生...
-
2つのselect文をunion all で...
-
access2003 クエリSQL文に...
-
SQLによる"あいうえお"順でソー...
-
knowledge on, about, of
-
EXISTSを使ったDELETE文
-
大文字/小文字の区別しないで検...
-
no other~について
-
count集計の結果が0の場合でも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定条件でWHERE句の条件を変更...
-
oracleからSQL Serverへの移行
-
SELECT(結合)について
-
field3で特定の値が入っている...
-
差し込み後、元データを変更し...
-
外部参照してるキーを主キーに...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
SELECT 文 GROUP での1件目を...
-
1、Rstudioで回帰直線を求める...
-
for whichの使い方
-
カーソル0件の時にエラーを発生...
-
SQLで特定の項目の重複のみを排...
-
EXISTSを使ったDELETE文
-
datetime型でNULL値を入れたい。
-
SQLServerで文字列の末尾からあ...
-
1日に1人がこなせるプログラム...
-
INSERT文でフィールドの1つだ...
-
列のヘッダーを含めるのをデフ...
-
SQL Date型の列から年月だけを...
おすすめ情報