oracle语句转mysql语句所遇到的问题

1、首先,为了方便查询课提高效率,我们总是喜欢给oracle主键定义一个索引,但是,MYSQL里面没有啊,所以索引都会失效

2、错误:
Every derived table must have its own alias
   中文意思:
每个派生出来的表都必须有一个自己的别名。
   错误原因:
一般在多表查询时,会出现此错误,例如我在进行如下查询时遇到的,语句为:select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user  on tbl_topic.userid=tbl_user.userid  where  tbl_topic.boardid=? order by recenttopicmodifytime desc) where rownum<=1;其实解决方法也很简单,因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名,虽然只加了一个没有任何作用的别名a,但这个别名是必须的.
    改进: 
select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user  on tbl_topic.userid=tbl_user.userid  where  tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where rownum<=1

3、继续刚才那个语句,别名的问题解决了,但是又出错了:
Unknown column 'rownum' in 'where clause' 
   中文意思:未知的列出现在where后面。
   错误原因:
看了下mysql官方的解释,发现在嵌套的查询语句中,当用到where的时候,数据的条数可能还没有被决定, rownum这是根本都还没出来,所以会报错(注:官方解释:http://dev.mysql.com/doc/refman/4.1/en/problems-with-alias.html)。so,我们需要改一改slq语句,既然rownum不能使用,而我们知道它的意思,其实就是查出来的列数,那么,我们只需要在前面加一个COUNT( * ) AS cnt就行了。
    改进: 
select *,count(*) as cnt from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user  on tbl_topic.userid=tbl_user.userid  where  tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where cnt<=1

4、但是,相信对mysql熟悉的小伙伴已经看出来了,既然用的事count(*) as cnt,那么where后面则不能用cnt<=1,或者说cnt<=1的这个条件前面不能使用where,
在一个标准的SQL不允许引用列别名在哪里(where)条款。 这一限制强加因为当在哪里(where)条款是评估, 列值可能尚未被确定,so,总之一句话,因为cnt是不确定的值,所以不能用where,只能用having,最终语句为:select *,count(*) as cnt from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user  on tbl_topic.userid=tbl_user.userid  where  tbl_topic.boardid=? order by recenttopicmodifytime desc) as a having cnt<=1

5、分页查询,oracle需要用十分复杂的语句去完成一个分页查询,但是在mysql里面,只需要一个简单的函数就OK了,那就是limit 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值