关于SQL语句的一个小技巧

今天在帮同事解决一个客户提出的比较生僻的需求时,连锁反应想到前几天一位群友的一个问题,并且解决了,很是开心。

问题描述:在SQLite数据库中,不支持row_number() over() ,怎么来对某列进行排序并标记行号呢?

思路来自于:查询某个表中某列排在第N的那条数据。在SQLserver和oracle中都有row_number() over() 可以实现,可是对于不支持这个的sqlite,只能用另外一个方式来实现:

求t表中X列第二的数据:
select *  
 from t  
 where (select count(*) +1
 from t t2  
 where t2.x > t.x ) = N  

因此:(select count(*) +1  from t t2   where t2.x > t.x )  如果放在select 后边可以替代row_number() over() 的。

-----------------------------------------------分割线--------------------------------------------

例子:

问题描述,现在有两种表,table2是历史记录表,table1是临时表,table2是申请记录表,table1是发货表,
现在,要的结果是,根据table1发货的数据,修改table2表的记录,一条只能匹配一条,下面是测试数据,最后
想要的结果是table2如下:
(1,'Iphone4','张三','2013/05/18 11:33:21',1)
(2,'Iphone4','张三','2013/05/18 11:38:01',1)
(3,'Iphone4','张三','2013/05/18 11:39:41',0)
(4,'Iphone4','李四','2013/05/18 11:33:21',1)
(5,'Iphone5','王五','2013/05/18 11:33:21',0)
按照先进现出的原理,进行发货。在sqlserver我知道处理,使用 row_number() over() 但是在sqltie中
不支持这些函数,所以特请教。

镜子雨 回复:

Create TABLE table1 (ID INT ,AreaName VARCHAR(20),EmployeeName VARCHAR(20))
insert into table1(id,areaName,employeeName) values(1,'Iphone4','张三')
insert into table1(id,areaName,employeeName) values(2,'Iphone4','张三')
insert into table1(id,areaName,employeeName) values(3,'Iphone4','李四')

CREATE TABLE TABLE2 (ID INT,AreaName VARCHAR(20),EmployeeName VARCHAR(20),CreateTime VARCHAR(50),IsSend bit)
insert into table2(id,areaName,employeeName,CreateTime,IsSend) values(1,'Iphone4','张三','2013/05/18 11:33:21',0)
insert into table2(id,areaName,employeeName,CreateTime,IsSend) values(2,'Iphone4','张三','2013/05/18 11:38:01',0)
insert into table2(id,areaName,employeeName,CreateTime,IsSend) values(3,'Iphone4','张三','2013/05/18 11:39:41',0)
insert into table2(id,areaName,employeeName,CreateTime,IsSend) values(4,'Iphone4','李四','2013/05/18 11:33:21',0)
insert into table2(id,areaName,employeeName,CreateTime,IsSend) values(5,'Iphone5','王五','2013/05/18 11:33:21',0)
 
对于上边表,有个不使用row_number()语句如下:
select a.*,(select count(*)+1 from table2 b where a.[CreateTime]<b.[CreateTime]) rn from table2 a
order by createtime desc



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值