• ベストアンサー

SQLについて

こんばんは。 SQLについて質問です。 STUDENTテーブル student_id name birth -------------------------------- 1000 AAAA 19800101 1003 BBBB 19801102 1010 CCCC 19810101 このようなテーブルがあるときに、 主キーのstudent_idのあいてる番号が知りたい場合は どのようなSQLにすればよいのでしょうか? 1000から1020で空いてる番号を検索するような SQLを教えてください! 色々と試してみたのですが、よくわからなくて。。。 すみませんがよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.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;

noname#229153
質問者

お礼

こんばんは。 ご回答ありがとうございます。 CASE分を使用するのですね! 知りませんでした。。。 教えていただいたSQLを理解したうえで 試してみます。 本当にありがとうございます。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

若干、条件がゆるくなりますが、「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が解説されています。

参考URL:
http://codezine.jp/article/detail/1420?p=2
  • ESE_SE
  • ベストアンサー率34% (157/458)
回答No.1

このテーブル単体では難しいでしょうね。 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 を実行すれば良いかと思います。

noname#229153
質問者

お礼

こんばんは。 ご回答ありがとうございます。 他にテーブルを持てば検索できるのですね。。。 参考になりました。 今はテーブルを作れる環境ではないので、 明日試してみます。 ありがとうございます。

関連するQ&A