我有一张桌子TblClient。
2个重要的列是:ClientID(PK,增量)和ClientNumber。
我们可以添加新客户端,并且ClientID会自动分配,但是ClientNumber可以选择。
我们想对进行“建议” ClientNumber,但用户可以决定输入自己的电话号码,而不接受我们的建议。
建议必须是第一个可用的ClientNumber大于2200(首先ClientNumber是2200)。
我们这样做是因为,如果用户输入一个手册号(例如5000),而最后插入的手册号是2500,则我们不会将下一个“建议”设为5001,而是2501。
用查询返回此数字的正确方法是什么?
谢谢!
您可以使用自左连接反模式来解决它,如下所示:
select coalesce(min(c.ClientNumber) + 1, 2200) first_available_client_id
from tblclient c
left join tblclient c_free on c_free.ClientNumber = c.ClientNumber + 1
where c_free.ClientID is null
Run Code Online (Sandbox Code Playgroud)
说明:left join尝试将每条记录与具有下一个客户编号的另一条记录合并。然后,该where子句过滤不匹配的连接,这意味着表中尚未使用下一个客户编号的记录。最后,聚合函数min(...) + 1返回第一个可用的客户号码。该函数在表为空时coalesce()返回。2200
为了提高效率,您需要一个索引ClientNumber(它应该已经存在,因为您希望该列是唯一的)。
避免使用聚合的另一个选项是:
select c.ClientNumber + 1 first_available_client_id
from tblclient c
left join tblclient c_free on c_free.ClientNumber = c.ClientNumber + 1
where c_free.ClientID is null
order by c.ClientNumber
limit 1
Run Code Online (Sandbox Code Playgroud)
但是,此选项不处理表为空的情况。
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |