dポイントプレゼントキャンペーン実施中!

状態によって、取得したいデータをかえたい場合のSQLについて

初心者で困っています。

以下は、状態が1,2,3の場合はデータを取得し、4の場合はデータを取得しないSQLです。

SELECT
 みかん.連番
 みかん.入荷日
FROM
 みかん
 INNER JOIN 状態
  ON みかん.状態 = 状態.連番
WHERE
 みかん.状態 IN (1,2,3)

みかんT
連番   入荷日    状態
1   2010/02/01  1
2   2010/02/03  3
3   2010/02/08  4
4   2010/02/09  1
5   2010/02/13  2
6   2010/02/18  3

状態T
状態連番  項目
 1    良好
 2    まぁまぁ
 3    不良
 4    破棄

これからが質問なのですが、
みかんTの連番3の状態が4の場合、状態3のデータ(みかんTでいう連番2,6)は取得したくありません。
そうするには、どう書き換えたらうまく動作するでしょうか・・・

宜しくお願いいたします。。

A 回答 (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));
    • good
    • 0
この回答へのお礼

たびたびの御回答ありがとうございます。

WHERE みかん.状態 IN (1,2,3)
AND NOT EXISTS ( SELECT * FROM みかん WHERE みかん.状態 IN (4))

上記の記述で解決できました。

EXISTSを使うこと自体頭になかった(使い方もよくわかっていなかった)ため、
とても勉強になりました。

ありがとうございます(*´∀`*)

お礼日時:2010/02/25 09:29

実機確認していませんが、条件式を次のようにしてみては?



WHERE
(SELECT 状態 FROM みかん WHERE 連番=3)=4 AND 状態<>3
OR
(SELECT 状態 FROM みかん WHERE 連番=3)<>4 AND 状態 IN (1,2,3)

この回答への補足

御回答ありがとうございます。

記述どおりにしてみますと、

”サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。”

というエラーが出ました。

もう少し、考えてみたいと思います。

ありがとうございます。

補足日時:2010/02/24 15:42
    • good
    • 0

だめでしたか・・・



 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のみしか取得できません(´・ω・`)

再度の御回答なのに、解決できず申し訳ないです。
上記記述も考慮して、考えてみたいと思います。
ありがとうございます!

補足日時:2010/02/24 15:39
    • good
    • 0

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が取得できませんでした。。

補足日時:2010/02/24 12:39
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

上の条件を試してみましたが、状態4がないのに3が取得できません。。

下の条件はエラーが出ました。

この記述を基盤に色々といじってみようと思います。
ありがとうございます。

お礼日時:2010/02/24 12:35

>みかん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)を取得する

その通りです。
説明不足ですみません・・・(汗

補足日時:2010/02/24 11:31
    • good
    • 0

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