- ベストアンサー
SQLについて
こんばんは。 SQLについて質問です。 STUDENTテーブル student_id name birth -------------------------------- 1000 AAAA 19800101 1003 BBBB 19801102 1010 CCCC 19810101 このようなテーブルがあるときに、 主キーのstudent_idのあいてる番号が知りたい場合は どのようなSQLにすればよいのでしょうか? 1000から1020で空いてる番号を検索するような SQLを教えてください! 色々と試してみたのですが、よくわからなくて。。。 すみませんがよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 先ほどのSQLのWHERE句に抜けが有りました。正しくは下記の様になります。 SELECT CASE WHEN COUNT(*) = 0 OR MIN(student_id) > 1000 THEN 1000 ELSE ( SELECT MIN(student_id + 1) FROM student s1 WHERE student_id >= 1000 AND NOT EXISTS (SELECT * FROM student s2 WHERE s2.student_id = s1.student_id + 1)) END FROM student WHERE student_id >= 1000;
その他の回答 (2)
- root139
- ベストアンサー率60% (488/809)
若干、条件がゆるくなりますが、「1000以上のstudent_idの最小の欠番を取得する」SQLでしたら、CASE式と相関サブクエリを使えば出来るかと。 例) --------------------------------------------------------------- SELECT CASE WHEN COUNT(*) = 0 OR MIN(student_id) > 1000 THEN 1000 ELSE ( SELECT MIN(student_id + 1) FROM student s1 WHERE NOT EXISTS (SELECT * FROM student s2 WHERE s2.student_id = s1.student_id + 1)) END FROM student; ------------------------------------------------------------------- 参考URLでこのSQLが解説されています。
- ESE_SE
- ベストアンサー率34% (157/458)
このテーブル単体では難しいでしょうね。 IDマスタテーブル(idMaster) masterID --------- 1000 1001 ・・・ という形で「空き番号を検索する対象の番号」をレコードにしておきます。 その上でクエリ SELECT masterID FROM (SELECT masterID, STUDENT.name FROM idMaster LEFT JOIN STUDENT ON idMaster.masterID=STUDENT.student_id) AS T WHERE T.name IS NULL を実行すれば良いかと思います。
お礼
こんばんは。 ご回答ありがとうございます。 他にテーブルを持てば検索できるのですね。。。 参考になりました。 今はテーブルを作れる環境ではないので、 明日試してみます。 ありがとうございます。
お礼
こんばんは。 ご回答ありがとうございます。 CASE分を使用するのですね! 知りませんでした。。。 教えていただいたSQLを理解したうえで 試してみます。 本当にありがとうございます。