質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2338閲覧

Oracle SQLでの条件指定

seiya0621

総合スコア30

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/07/07 01:04

編集2020/07/07 01:21

SQL> SELECT "従業員番号" FROM "A会社"
2 WHERE "交通費" > 5000;

従業員番号 交通費


85001 8900
86010 10200
87003 6000
85003 8800

となります。

ここで"交通費"が5000以上の場合の最小値の"従業員番号"を取得したいのですが、うまくいきません。

試したのは、
SELECT "従業員番号" FROM "A会社"
2 WHERE MIN("交通費") > 5000;

ORA-00934: ここではグループ関数は使用できません。とでます。

また、
SQL> SELECT "従業員番号" FROM "新宿校舎"
2 HAVING MIN("交通費") > 5000;

ORA-00937: 単一グループのグループ関数ではありません。とでます。

SQL> SELECT "従業員コード" FROM "新宿校舎"
2 HAVING MIN("交通費") > 5000
3 GROUP BY "ド従業員コード";

とすると

従業員コード

85001
85003
86010
87003

となり"交通費"が5000以上の従業員コード全てがでてきてしまいます。

交通費が5000以上の中で最小値の講師コードを取得したいのですが、どこが間違っているのでしょうか?

アドバイスをよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetsunosuke

2020/07/07 01:08

どのようなエラーが出ているのかも書いてみましょう そしてそのエラーを見るとMINを使うときにGROUP BY を合わせて使うことが必要、という結論にたどり着くはずです。
seiya0621

2020/07/07 01:22

ありがとうございます。 GROUP BYを使用してみましたが、希望するデータは取得できませんでした。 アドバイスお願いいたします。
guest

回答1

0

ベストアンサー

条件いまいちよく分かりませんので、取りあえず以下のパターンで。

「交通費が5,000超過のうち最小額のデータ」

SQL

1select * from A会社 2where 交通費 in ( 3 select min(交通費) from A会社 where 交通費 > 5000 4 )

「交通費が5,000超過のうち最小額であるデータの最小従業員番号」

SQL

1select min(従業員番号) from A会社 2where 交通費 in ( 3 select min(交通費) from A会社 where 交通費 > 5000 4 )

「交通費が5,000超過のうち最小額であるデータの最小従業員番号」※exists

SQL

1select min(従業員番号) from A会社 t 2where 交通費 > 5000 3 and not exists ( 4 select 1 from A会社 where 交通費 > 5000 and 交通費 < t.交通費 5 )

[DB] 副問合せと相関副問合せの違い [SQL]
高度な副問合せの構文

投稿2020/07/07 01:32

編集2020/07/07 02:55
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seiya0621

2020/07/07 01:40

ありがとうございます! 取得できました! 可能であればEXISTS文で書いた場合はどのようになるか教えていただいてもよろしいでしょうか? 2つの書き方をおぼえたいのですが、EXISTS文については中々理解ができず...汗
sazi

2020/07/07 01:43

先ずは、どっちのパターンで解決したのでしょうか?
seiya0621

2020/07/07 01:45

「交通費が5,000超過のうち最小額であるデータの最小従業員番号」で解決できました!
sazi

2020/07/07 01:59 編集

existsでない方の「交通費 > 5000」の条件は無くても同じ結果です。 相関副問合せの特性で、条件があった方が駆動表の件数が絞られるので、コストが下がるかもしれません。 ↑と思ったけど、大小が同じ方向なら不要だけど、方向が違うので必要ですね。
seiya0621

2020/07/07 02:26

2点質問をお願いいたします。 ① exists ( select 1 from A会社 ~) の1は何を指しているのでしょうか? ② exists ( select 1 from A会社 ~ 交通費 < t.交通費) の 交通費 < t.交通費 の部分が理解ができていないです。 交通費とt.交通費は複数のデータがあると思うのですが、比較することができるのでしょうか?  的外れなことを質問していたらも申し訳ありません。
sazi

2020/07/07 02:56 編集

①existsは存在するかどうかなので、select項目は何でも良いのです。 ②相関副問合せを理解する必要があります。existsは殆ど相関副問合せで行います。 リンクを回答に追記します。
seiya0621

2020/07/07 03:03

ありがとうございます! 確認してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問