毎度ここにお世話になっております。
売上詳細という表の中にNOとSYOHIN_CDの列があるとします。
Noは1~10まであり、SYOHIN_NAMEにはNo6の列だけ文字が入っています。
ここで、No1~N5はSHYOHIN_NAMEはNULLで、No6~No10のいずれかのSYOHIN_NAMEに文字が入っている物を検索するにはどうしたらいいでしょう?
SELECT * FROM hanbai.売上 AA where
EXISTS (select * from hanbai.売上詳細 BB where BB.NO between 1 and 5 and SYOHIN_NAME is null
and BB.NO between 6 and 10 and SYOHIN_NAME is not null);
構文間違っているので表示されませんが・・・ちゃんと表示されるSQLを教えてください。お願いします。オラクルです。
説明がおかしくてわかりづらいと思いますが、補足しますのでよろしくおねがいします。
No.1ベストアンサー
- 回答日時:
まず、論理AND/OR演算子の意味 ( 概念レベルでの ) と用法を正しく理解しましょう。
一例ですが、
WHERE ID = 1 OR ID = 2
だと、「IDが1、または2」のレコードが抽出されますが、
WHERE ID = 1 AND ID = 2
「IDが1であり、かつ2でもある」条件となり、該当するレコードは論理的に存在し得ません。
※ 概念が抽象的で理解しにくい場合は、
WHERE 消息 = '生存' OR 性別 = '死亡'
WHERE 消息 = '生存' AND 性別 = '死亡'
または、
WHERE 性別 = '男' OR 性別 = '女'
WHERE 性別 = '男' AND 性別 = '女'
で考えてみてください。
上記の内容が理解できたら、次に演算子の結合優先順位は括弧の使い方で変化することを理解しましょう。
2 + 3 × 4
と
(2 + 3) × 4
はおなじではありません。(2 + 3 × 4 = 14 ですが、(2 + 3) × 4 = 20 となります)
ANDとORが入り混じった条件式では、結合順序を明確にするため、(必要の有無に関わらず)括弧を付けるのが一般的です。
この回答への補足
優先順位をつけるために()をつけるのはわかりました。
なので、
SELECT * FROM hanbai.売上 AA where
exists (select * from 売上詳細 BB where
((BB.NO between 1 and 5) and (BB.syohin_name
is null)) and ((BB.NO between 6 and 10) and
(BB.syohin_name is not null)) and
AA.uriage_no = BB.uriage_no);
でやったのですが、結果がすべてでてきてよくわからなく
なりました。
NOの1~5のsyohin_nameがnullで、かつNOの6~10のsyohin_nameがいずれか文字が入ってれば結果を渡したいのだからすべて『and』でよろしいんですよね?そのところがよくわからなくなってきたのでどうかよろしくおねがいします。
No.3
- 回答日時:
つまり、No.が1~5までの時は、syohin_nameはnullなんですね。
(nullでも良いとnullだ、というのは違います。)No.が6~10の時は、syohin_nameはnullであってはいけないんですよね。
SELECT * FROM hanbai.売上 AA where
exists (select * from 売上詳細 BB where
((BB.NO between 1 and 5) and (BB.syohin_name
is null)) or ((BB.NO between 6 and 10) and
(BB.syohin_name is not null)) and
AA.uriage_no = BB.uriage_no);
>ここで、No1~N5はSHYOHIN_NAMEはNULLで、No6~No10のいずれかのSYOHIN_NAMEに文字>が入っている物を検索するにはどうしたらいいでしょう?
という事は、
No. syouhin_name
1 null
2 null
3 null
4 null
5 null
6 ABCDEFl
7 null
8 null
9 null
10 null
とイメージしてよいですか?
これだと、別にNo.は関係ない気がしますが・・・。
SELECT * FROM 売上 AA,売上明細 BB
WHERE AA.uriage_no = BB.uriage_no
AND BB.syouhin_name is not null;
検索できるはずですが、はずしていたらごめんなさい。
ただ、もう少しおやりになりたい事を具体的にかかれた方が、回答者も助かりますが。お願いします。
この回答への補足
説明があやふやですみません。
えっと、上の表はそのままあっています。その状態だけ表示させたいです。1~5にはNULLが必ず入ってて、6~10は文字が入る(表示させたい列にはほとんどの場合、NO、6に文字が入ってます。)
で表示させたくないのは、1つ目が、NO1~5までにNAMEの列に文字がはいっている。そしてNO6~10までにもNAMEに文字がはいっている。2つ目がNO1~5までにNAMEはすべてNULLが入っていて、そしてNO5~10までにNAMEに文字が入っている。です。
自分で試したのは、
SELECT * FROM hanbai.売上 AA where
exists (select * from 売上詳細 BB where
((BB.NO between 1 and 5) and (BB.syohin_name
is null)) and ((BB.NO between 6 and 10) and
(BB.syohin_name is not null)) and
AA.uriage_no = BB.uriage_no);
です。これでNO1~5までがnameがnullでNO6~10まではNAMEがいづれか文字が入っていて、売上のuriage_noと売上詳細のuriage_noが同じ値のみ表示させるからこれで大丈夫だと思ったのですが、表示させたい物まで表示されません。
No.2
- 回答日時:
> ここで、No1~N5はSHYOHIN_NAMEはNULLで、No6~No10のいずれかのSYOHIN_NAMEに文字が入っている物を検索するにはどうしたらいいでしょう?
この文はデータの現状の説明なのでしょうか?
それとも出力の条件なのでしょうか?
No.にかかわらず、SYOHIN_NAMEに文字がある(Not NULL)
なら、以下の文ではいかがですか?
select *
from hanbai.売上 aa
where AA.uriage_no in
(
select BB.uriage_no
from 売上詳細 BB
where bb.SYOHIN_NAME is not null
);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DATE型にNULLをセットするには?
-
GROUP BYを行った後に結合した...
-
実績累計の求め方と意味を教え...
-
Accessで別テーブルの値をフォ...
-
沿線コード
-
レコードが存在しなかった場合
-
Oracleでの文字列連結サイズの上限
-
"カレントレコードがありません...
-
select句副問い合わせ 値の個...
-
キーが同じを複数行を1行にま...
-
アクセスでレポートの1印刷内...
-
差し込み印刷のレコード数について
-
SELECTの結果で同一行を複数回...
-
最新の日付とその金額をクエリ...
-
Excelで、改行がある場合の条件...
-
ワードの差込印刷で教えて下さ...
-
sqlplusの処理が途中でとまる
-
ACCESSで大量の更新を行うと「...
-
【Access】選択クエリのグルー...
-
SELECTで1件のみ取得するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DATE型にNULLをセットするには?
-
SQL文で素早くNULLを除外する方法
-
副問合せで質問です
-
ストアドプロシージャのSET文に...
-
正常終了するが追加されない
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
Accessで別テーブルの値をフォ...
-
select insertで複数テーブルか...
-
SELECTで1件のみ取得するには?
-
実績累計の求め方と意味を教え...
-
Access終了時の最適化が失敗?
-
ADO VBA 実行時エラー3021
-
GROUP BYを使ったSELECT文の総...
-
レコードが存在しなかった場合
-
Excelでセルの書式設定を使用し...
-
カレントレコードが無い事を判...
-
select句副問い合わせ 値の個...
-
SQL文で右から1文字だけ削除す...
-
ファイル書込みで一行もしくは...
おすすめ情報