Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlite中选择结果集之前的行_Sql_Sqlite - Fatal编程技术网

在sqlite中选择结果集之前的行

在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日前获得

假设我有一个名为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日前获得第一行后停止读取结果。

一旦上述查询结果在当前列表中可用,则可以使用光标访问任何返回的行。

我对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'
            )