mysql - SQL - 手动获取给定格式的下一个可用 ID
问题描述
我正在尝试构建一个简单的 SQL SELECT 语句,该语句手动提供可用于给定格式的下一个唯一 ID。
例如,请参见下表。
-- Students (Table)
-- ID - Not a primary key
-- Type - Numbering format
+----------+------+
| ID | Type |
+----------+------+
| 1 | M |
| 2 | M |
| 5 | M |
| 7056 | F |
| 7057 | F |
| 7058 | F |
| 7090 | F |
| 7091 | N |
| 10910 | N |
| 10911 | N |
| 99000000 | O |
| 99000001 | O |
+----------+------+
-- Some of the available values:
+---+------+-------+----------+
| M | F | N | O |
+---+------+-------+----------+
| 6 | 7092 | 10912 | 99000002 |
| 7 | 7093 | 10913 | 99000003 |
| 8 | 7094 | 10914 | 99000004 |
+---+------+-------+----------+
在这里,假设我想为“F”类型获取“7092”作为下一个值。但如果我使用 MAX 函数,它将返回 '99000002'。
SELECT MAX(id)+1 FROM students;
如果我使用类型列,我可以获得类型“F”的“7091”,但这不可用,因为它被另一种类型使用。
SELECT MAX(id)+1 FROM students WHERE type = 'F';
这也行不通。
SELECT MAX(id)+1
FROM students
WHERE type = 'F'
AND id NOT IN ( SELECT DISTINCT id FROM students)
我无法更改数据库结构。如果是这样,对于给定的场景,是否有办法(单个 SELECT 语句)获取所选类型(例如:类型 F)的下一个可用 ID?
我使用 Oracle 10g,但 MySQL 和 SQL Server 也可以。
CREATE TABLE students (
id NUMBER,
type CHAR(1)
);
INSERT INTO students VALUES (1, 'M');
INSERT INTO students VALUES (2, 'M');
INSERT INTO students VALUES (5, 'M');
INSERT INTO students VALUES (7056, 'F');
INSERT INTO students VALUES (7057, 'F');
INSERT INTO students VALUES (7058, 'F');
INSERT INTO students VALUES (7090, 'F');
INSERT INTO students VALUES (7091, 'N');
INSERT INTO students VALUES (10910, 'N');
INSERT INTO students VALUES (10911, 'N');
INSERT INTO students VALUES (99000000, 'O');
INSERT INTO students VALUES (99000001, 'O');
如有任何帮助,我将不胜感激。无论如何,感谢您的宝贵时间。
解决方案
您正在寻找差距,因此您正在寻找NOT IN
id 列表中的值。
以下查询将为您提供表中所有 id 的NOT IN
列表。
SELECT sub_id FROM (
SELECT id+1 as sub_id FROM students
)sub_table WHERE sub_id NOT IN (
SELECT id FROM students
);
然后您可以选择该MIN()
列表的:
SELECT MIN(sub_id) FROM (
SELECT id+1 as sub_id FROM students
)sub_table WHERE sub_id NOT IN (
SELECT id FROM students
);
请记住,这仅在您已经拥有至少一个 id 时才有效,并且除非您已经拥有 id 1,否则它不会从 1 开始。
注意:第一个查询只为您提供所有间隙的列表以及下一个可用的 id。
推荐阅读
- matrix - 是否可以提取模型视图矩阵的模型部分?
- coinbase-api - Coinbase API 列出真实存款
- vba - VBA 附加属性
- java - 如何检查两个 Java 类在语义上是否相同?
- javascript - jQuery - 检测 div 是否有 2 个类
- python-3.x - 导入错误散景显示(),无法导入名称“MACROS”
- android - 什么可能导致改造 okhttp get 请求不调用其 onResponse() 或 onFailure() 方法?
- python - 将数据帧拆分为分组块
- python - 让python查找单词并输出
- google-app-engine - Fire Store 使用 10 kb 数据库和一个用户存储 200 万次读取和 4 GB 下载?