在sqlite中选择结果集之前的行
假设我有一个名为data的表 数据 如果我做这样的select语句在sqlite中选择结果集之前的行,sql,sqlite,Sql,Sqlite,假设我有一个名为data的表 数据 如果我做这样的select语句 SELECT * FROM data where date = '20/8/2010'; 是否可以编辑此select语句以同时获取其前面的行。在本例中,它返回我的第3-5行。但是,是否可以通过任何方式编辑sqlstatement来选择第2行?也许这与您想要的很接近: SELECT * FROM data where date <= '20/8/2010' order by date desc; 然后在8月20日前获得
SELECT * FROM data where date = '20/8/2010';
是否可以编辑此select语句以同时获取其前面的行。在本例中,它返回我的第3-5行。但是,是否可以通过任何方式编辑sqlstatement来选择第2行?也许这与您想要的很接近:
SELECT * FROM data where date <= '20/8/2010' order by date desc;
然后在8月20日前获得第一行后停止读取结果。一旦上述查询结果在当前列表中可用,则可以使用光标访问任何返回的行。我对SQLITE一无所知,但对于SQL Server,例如,我可能会执行以下操作:
Select d.*
from data d,
(SELECT min(id) As LowestID FROM data where date = '20/8/2010') m
where d.id=m.LowestID-1
SELECT * FROM (SELECT TOP 1 * FROM data where date < '20/8/2010' ORDER BY date DESC, id DESC)
UNION
SELECT * FROM data where date = '20/8/2010'
;
这假设之前的行的条件是日期最大的行<您查询的日期,如果多行具有该日期,则抓取id最大的行。适应与原始查询的并集:
SELECT d.*
FROM data d
JOIN (
SELECT MIN(id) lowest_id
FROM data
WHERE date = '20/8/2010'
) dt ON (dt.lowest_id - 1 = d.id)
UNION
SELECT *
FROM data
WHERE date = '20/8/2010';
在sqlite 3中测试的测试用例:
CREATE TABLE data (id int, date date, name varchar(10));
INSERT INTO data VALUES (1, '19/8/2010', 'John');
INSERT INTO data VALUES (2, '19/8/2010', 'Mary');
INSERT INTO data VALUES (3, '20/8/2010', 'Peter');
INSERT INTO data VALUES (4, '20/8/2010', 'Bert');
INSERT INTO data VALUES (5, '20/8/2010', 'Ernie');
结果:
id date name
---------- ---------- ----------
2 19/8/2010 Mary
3 20/8/2010 Peter
4 20/8/2010 Bert
5 20/8/2010 Ernie
这是假设在前面的行中,您打算使用前面id值的行。在这种情况下,选择第2行的标准是什么?恐怕没有标准:\@Kenneth:您使用的是什么DBMS?我不太清楚wat DBMS的意思,但我使用的是SQLITE。如果没有标准,您当时怎么知道这是您想要的第2行?!SQLite支持限制语法,当然注意到在某些情况下,对于某些日期和数据,SELECT TOP 1部分不会返回任何行。感谢各位的回答,我将此作为理想答案。真的很感激,伙计们。
id date name
---------- ---------- ----------
2 19/8/2010 Mary
3 20/8/2010 Peter
4 20/8/2010 Bert
5 20/8/2010 Ernie
Select Id, [Date], Name
From MyTable
Where [Date] = '2010-08-20'
Union All
Select Id, [Date], Name
From MyTable
Where Id = (
Select Max(T2.Id)
From MyTable As T2
Where T2.[Date] < '2010-08-20'
)