天天看點

關于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

           
sql