• ベストアンサー

複数の条件

名前 G番号 G連番 数量  チーム AAA   1    1    80    1 AAA   2    1    99    1 AAA   3    1    98    1 AAA   3    2    60    1 AAA   4    1    99    1 AAA   4    2    97    1 BBB   1    1    22    2 BBB   2    1    19    2 BBB   2    2    99    2 BBB   3    1    50    2 CCC   1    1    99    1 CCC   2    1    99    1 DDD   1    1    99    1 DDD   2    1    99    1 DDD   1    1    99    2 DDD   2    1    99    2 以上のようなテーブル T_Aがあるとして、以下のような優先順位での抽出条件を考慮した場合のSQL記述方法が分かりません。教えていただけますでしょうか。 名前  "AAA" OR "DDD" ↓ チーム "1" ↓ G番号 "最大"のもの ↓ G連番 "最大"のもの 欲しいレコード 名前 G番号 G連番 数量  チーム AAA   4    2    97    1 DDD   2    1    99    1 以下のようにやってみましたが駄目でした。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE 名前='AAA' OR 名前='DDD' AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A)) AND (G連番=(SELECT MAX(G連番) FROM T_A)) 宜しく御願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • funaho
  • ベストアンサー率58% (43/74)
回答No.2

抽出条件を考えて書いたSQLはこうなります。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE (名前='AAA' OR 名前='DDD') AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A))AND (G連番=(SELECT MAX(G連番) FROM T_A)) 欲しいレコードから考えて書くとSQLはこうなりました。 SELECT 名前, G番号, G連番, 数量, チーム FROM T_A WHERE チーム='1' AND ((名前='AAA' and G番号=(SELECT MAX(G番号) FROM T_A where 名前='AAA') AND G連番=(SELECT MAX(G連番) FROM T_A where 名前='AAA')) OR (名前='DDD' and G番号=(SELECT MAX(G番号) FROM T_A where 名前='DDD') AND G連番=(SELECT MAX(G連番) FROM T_A where 名前='DDD')));

cave1
質問者

お礼

抽出条件フローの考え方自体間違っていたようですね。 無事、抽出が出来ました。 有難うございました。

その他の回答 (1)

noname#29127
noname#29127
回答No.1

名前='AAA' OR 名前='DDD' の部分を (名前='AAA' OR 名前='DDD') にしてもダメですか? 記載のままでは、名前='AAA'の時か、その右側の条件の ものが選択されるのでは?

cave1
質問者

お礼

ORの扱い方を間違えてました。 ただ、これだと最終的にAAAのG番号とDDDのG番号の比較を行ってしまいAAAの分しか抽出しませんでした。funahoさんから教えていただいたようにAAAとDDDを別々に処理することで解決できました。 有難うございました。