- ベストアンサー
SQLによる状態別データ取得方法
- 初心者の方に向けて、状態によって変わるデータを取得するSQLの書き方について解説します。状態が1,2,3の場合はデータを取得し、4の場合は取得しないように条件を設定します。
- みかんTテーブルと状態Tテーブルを結合し、みかんTの状態列と状態Tの状態連番列を照合します。みかんTの状態が1,2,3の場合のみデータを取得し、4の場合は取得しないようにします。
- 具体的には、SELECT文でみかんTの連番と入荷日を指定し、FROM句でみかんTテーブルを指定します。INNER JOINを使用して、みかんTの状態列と状態Tの状態連番列を照合します。WHERE句でみかんTの状態が1,2,3の場合のみ取得するように条件を指定します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>にしますと、状態が1,3の場合は、1のみしか取得できません 「状態が1,3の場合」というのはみかんTに状態が1,3の データしかないという意味ですよね? この条件で「状態が1,3の場合は、1のみしか取得できません」 ということは他に原因があるかもですね。 ちなみに以下のselect文で期待している値は取れますでしょうか? SELECT 連番, 入荷日, 状態 FROM みかん WHERE (状態 IN (1,2)) OR (状態 = 3 AND NOT EXISTS (select * from みかん where 状態 = 4));
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
実機確認していませんが、条件式を次のようにしてみては? WHERE (SELECT 状態 FROM みかん WHERE 連番=3)=4 AND 状態<>3 OR (SELECT 状態 FROM みかん WHERE 連番=3)<>4 AND 状態 IN (1,2,3)
補足
御回答ありがとうございます。 記述どおりにしてみますと、 ”サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。” というエラーが出ました。 もう少し、考えてみたいと思います。 ありがとうございます。
- ks0902
- ベストアンサー率85% (6/7)
だめでしたか・・・ 0 = CASE みかん.状態 WHEN '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4) ELSE 0 END select文 (SELECT COUNT(*) FROM みかん WHERE 状態 = 4) で0がかえってきてないでしょうね。 ちなみに SELECT isnull(COUNT(*),0) FROM みかん WHERE 状態 = 4 って書換えてもダメでしょうか? ダメなようなら、条件を みかん.状態 IN (1,2) OR (みかん.状態 = 3 AND NOT EXISTS (select * from みかん 状態 = 4)) に変更してみるとどうでしょうか?
補足
再度の御回答ありがとうございます。 SELECT文を >SELECT isnull(COUNT(*),0) FROM みかん WHERE 状態 = 4 にすると、逆に4のデータが取得されてきます。 後記の >みかん.状態 IN (1,2) OR >(みかん.状態 = 3 AND >NOT EXISTS (select * from みかん 状態 = 4)) にしますと、状態が1,3の場合は、1のみしか取得できません(´・ω・`) 再度の御回答なのに、解決できず申し訳ないです。 上記記述も考慮して、考えてみたいと思います。 ありがとうございます!
- ks0902
- ベストアンサー率85% (6/7)
sql serverがないので確認しておりませんが AND 0 = CASE みかん.状態 WHEN '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4) ELSE 0 END または AND 0 = CASE WHEN みかん.状態 = '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4) ELSE 0 END のどちらかを条件に追加してください。
お礼
御回答ありがとうございます。 上の条件を試してみましたが、状態4がないのに3が取得できません。。 下の条件はエラーが出ました。 この記述を基盤に色々といじってみようと思います。 ありがとうございます。
補足
すみません、下の条件もエラーは出ませんでした。 しかし、どちらの処理も同じ結果で、 4が含まれている3は取得できないようになっていますが、 4がない場合は3が取得できませんでした。。
- ks0902
- ベストアンサー率85% (6/7)
>みかんTの連番3の状態が4の場合、状態3のデータ(みかんTでいう連番2,6)は取得したくありません。 >そうするには、どう書き換えたらうまく動作するでしょうか・・・ この条件は みかんTに状態が4のデータがある場合は状態4、3のデータ以外(状態1、2)を取得する みかんTに状態が4のデータがない場合は全てのデータ(状態1、2、3)を取得する ということでしょうか?
補足
>みかんTに状態が4のデータがある場合は状態4、3のデータ以外(状態1、2)を取得する >みかんTに状態が4のデータがない場合は全てのデータ(状態1、2、3)を取得する その通りです。 説明不足ですみません・・・(汗
お礼
たびたびの御回答ありがとうございます。 WHERE みかん.状態 IN (1,2,3) AND NOT EXISTS ( SELECT * FROM みかん WHERE みかん.状態 IN (4)) 上記の記述で解決できました。 EXISTSを使うこと自体頭になかった(使い方もよくわかっていなかった)ため、 とても勉強になりました。 ありがとうございます(*´∀`*)