怎么将下面的sql语句从mssqlserver2k转到mysql?

Leemaasn 2003-09-07 06:40:26
说明:
下面的语句是用来找出表debug_tasks 里未用的最小的task_id 号,我近日将数据库从
mssqlserver2k转为mysql,却碰到这条语句无法通过,
请教各位高手,
类似这样的功能,我该怎么处理或实现?我对mysql 不是那么熟悉,

SELECT (CASE WHEN EXISTS(SELECT * FROM debug_tasks AS b WHERE task_id = 1) THEN task_id + 1 ELSE 1 END) AS task_id FROM debug_tasks WHERE NOT task_id IN(SELECT task_id - 1 FROM debug_tasks AS a)
...全文
32 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxf_1976 2003-09-09
  • 打赏
  • 举报
回复
经过测试,好像可以优化

select @maxid:=max(task_id) from debug_tasks;

select t1.task_id+1 from debug_tasks t1 left join debug_tasks t2 on t2.task_id<=@maxid and t1.task_id=t2.task_id-1 where t2.task_id is null order by t1.task_id limit 1;
嬉皮 2003-09-09
  • 打赏
  • 举报
回复
其始有很简单的SQL语句:
select min(task_id) from debug_tasks
lxf_1976 2003-09-09
  • 打赏
  • 举报
回复
sorry,多写了一个0,大概在>5000条记录时,就需要10秒钟以上
lxf_1976 2003-09-09
  • 打赏
  • 举报
回复
mysql4.0版本以下是不支持子查询的!

用以下SQL语句代替试试:

select t1.task_id+1 from debug_tasks t1 left join debug_tasks t2 on t1.task_id=t2.task_id-1 where t2.task_id is null order by t1.task_id limit 1;


不过我自己测试了,当整个表数据量比较大时(>50000条),速度比较慢
lxf_1976 2003-09-08
  • 打赏
  • 举报
回复
可否将出错信息贴出来?
lxf_1976 2003-09-08
  • 打赏
  • 举报
回复
是的,mysql4.0版本以前不支持子查询!

不过mysql中你的这个语句:
... WHERE NOT task_id IN (...) 好像应该是 ... WHERE task_id NOT IN (...)
Leemaasn 2003-09-08
  • 打赏
  • 举报
回复
MySQL 数据库服务器 返回错误信息:

You have an error in your SQL syntax near 'EXISTS(SELECT * FROM debug_tasks AS b
WHERE task_id = 1) THEN task_id + 1 ELSE 1' at line 1
ezhou 2003-09-07
  • 打赏
  • 举报
回复
mysql 4.05以下版本不能支持子查询,但所有的子查询都可以使用LEFT JOIN 或 AND 语句替代。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧