所以我假设我有一个名为data
id | date | name
---------------------
1 | 19/8/2010 | John
2 | 19/8/2010 | Mary
3 | 20/8/2010 | Peter
4 | 20/8/2010 | Bert
5 | 20/8/2010 | Ernie
如果我这样做一个选择语句
SELECT * FROM data where date = '20/8/2010';
是否可以编辑此select语句以获取它之前的行。在这种情况下,它返回行号3 - 5.但是可以以任何方式编辑sqlstatement以选择第2行吗?
答案 0 :(得分:2)
我对SQLITE一无所知,但对于SQL Server,我可能会做类似的事情:
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'
;
这假定您的“之前的行”的条件是具有最大日期&lt;的行。您查询的日期,如果有多行具有该日期,则抓住具有最大ID的那一行。
答案 1 :(得分:1)
Select d.*
from data d,
(SELECT min(id) As LowestID FROM data where date = '20/8/2010') m
where d.id=m.LowestID-1
答案 2 :(得分:1)
使用原始查询调整@SteveCav's solution到UNION
:
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
值的行。
答案 3 :(得分:1)
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'
)
答案 4 :(得分:0)
也许这接近你想要的东西:
SELECT * FROM data where date <= '20/8/2010' order by date desc;
然后在8月20日之前有第一行后停止读取结果。
答案 5 :(得分:0)
上述查询结果在当前列表中可用后,您可以使用游标访问任何返回的行。