テーブル TB の項目 CDがNUMBER型でユニークキーだとします。
このCDで
・ある値以上の空いている最小の番号を取得したい。
としたら1つのSQLで実現できますか?
例)
CDの値が
6・・・・80 150・・・ (81から149は存在しない)
という具合に存在していた場合に、101以上で空いている最小の番号
を取得したいのです。
この場合は101です。1が取得されても駄目、81が取得されても駄目です。
また、同じ条件でデータが
6・・・・150 200・・・ (151から199は存在しない)
の場合には151が取得したいのです。
このような値を検出するSQLってわかりますか?
以上よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
実際に試せる環境が手元にないけど
SELECT MIN(NO)
FROM ( SELECT NO
FROM DUAL
CONNECT BY LEVEL <= ( SELECT MAX(CD) FROM TABLE_1 ) ) Q
WHERE NO >= 101
AND NOT EXISTS
( SELECT 1
FROM TABLE_1
WHERE Q.NO=TABLE_1.CD )
一旦1からCDの最大値までの連番を生成して、その中でCDが存在していないデータの最小値を求める。
効率が悪そう。
回答ありがとうございます。ただこのSQLは最初のMIN(NO)のところで無効な識別子となりました。
実際にはここを参考に
http://d.hatena.ne.jp/yohei-a/20090819/1250663289
下記SQLにて思惑の数値の取得ができました。
-------------------------
SELECT MIN(CD) FROM (
SELECT CD FROM (SELECT LEVEL CD FROM DUAL CONNECT BY LEVEL <= 100+20000) X
WHERE NOT EXISTS (SELECT * FROM TB U WHERE X.CD = U.CD)
) WHERE CD>=100
どうもありがとうございました。
No.4
- 回答日時:
あまり考えてないので無理やり感でいっぱいですが・・・
select min(CD) + 1
from (
select CD from TB
union select (101 - 1) from DUAL)
where CD >= (101 - 1)
and (CD + 1) not in (
select CD from TB
union select (101 - 1) from DUAL
)
;
とか。
回答どうもありがとうございました。
このSQLで100件程度のテーブルでは、実際に思惑の数値は取得できました。
ただ、UNIONの影響と思われますが、テーブルのレコード数が160000件以上で
実行してみたところ、固まってしまいました。件数が増えるとだめなようです。
実際にはここを参考に
http://d.hatena.ne.jp/yohei-a/20090819/1250663289
下記SQLにて思惑の数値の取得ができました。
-------------------------
SELECT MIN(CD) FROM (
SELECT CD FROM (SELECT LEVEL CD FROM DUAL CONNECT BY LEVEL <= 100+20000) X
WHERE NOT EXISTS (SELECT * FROM TB U WHERE X.CD = U.CD)
) WHERE CD>=100
どうもありがとうございました。
No.3
- 回答日時:
SQLのSは「構造」です。
論理を積み上げないと、何時までも自作
できるようになりません。
1.CDが昇順に連続しているものを考える。
2.あるCDに着目し、これを●とする。
この●の直前の値を■とする。
●>■である。
3.●と■の差が2以上なら、値は連続
しておらず、抜け(空き)がある。
4.このような■に1を加算したものが求める
値になり、これが101以上であるから
■>=100が条件となる。
SELECT mae+1 AS empno
FROM (SELECT A.CD,MAX(B.CD) AS mae
FROM TB A LEFT JOIN TB B
ON A.CD>B.CD GROUP BY A.CD
HAVING MAX(B.CD)>=100
AND (A.CD-MAX(B.CD))>=2
ORDER BY A.CD)
WHERE ROWNUM=1
同じテーブルを2個結合し、主となる方をA、
従となる方をBとします。BはAより小さい
CDの集団で、その中の最大が直前の値、
つまり■になるのです。勿論、A.CDが●
です。
手元にOracleが無いので試していませんが、
理論上はこれで動作すると思います。
ROWNUM=1がやや心配です。
回答ありがとうございました。ただ、このSQLではNULLが帰ってくるため
思惑の数値が取得できませんでした。
実際にはここを参考に
http://d.hatena.ne.jp/yohei-a/20090819/1250663289
下記SQLにて思惑の数値の取得ができました。
-------------------------
SELECT MIN(CD) FROM (
SELECT CD FROM (SELECT LEVEL CD FROM DUAL CONNECT BY LEVEL <= 100+20000) X
WHERE NOT EXISTS (SELECT * FROM TB U WHERE X.CD = U.CD)
) WHERE CD>=100
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) VBAを使いシート間で貼り付け 3 2023/03/14 20:53
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
アクセスで「空き番」の確認
Access(アクセス)
-
欠番の取得方法
MySQL
-
初心者なのですが・・・accessで抜けている番号を探すには?
Access(アクセス)
-
-
4
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
5
ページ数を求めたい
Visual Basic(VBA)
-
6
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleのビュー作成時に「指定...
-
ROWNUMについて
-
ORACLEで一番最初の結果だけを...
-
WITH句で複数テーブルを定義す...
-
UPDATE文でこのような更...
-
Oracle SQLにて固定長でデータ...
-
distinct で抽出したレコード件数
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
Accessのフィールド数が255しか...
-
Accessでテーブル名やクエリ名...
-
Access テキスト型に対する指定...
-
【Access】フォームで自動計算...
-
ACCESSのクエリで集計で、先頭...
-
Excel→Accessへ貼り付けがおかしい
-
Accessでテーブルの値をテキス...
-
変数が選択リストにありません
-
Accessクエリーで両方のテーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORACLEで一番最初の結果だけを...
-
Oracleのビュー作成時に「指定...
-
Oracle SQLにて固定長でデータ...
-
ROWNUMについて
-
DB2でREPLACEによる文字列の置換
-
ある値以上の空き番の最小値を...
-
distinct で抽出したレコード件数
-
WITH句で複数テーブルを定義す...
-
抽出結果を1件ずつ次の抽出条件...
-
sqlplusで日本語入力
-
VBAのRows.Selectについて
-
group by でselect
-
時間の重複を加味した連続時間S...
-
PL/SQL 複数件同じ値で更新す...
-
重複
-
動的SQLでのDECODE
-
sqlの条件文に関して
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
おすすめ情報