我试图发现在主键是自动递增且不可重用的行ID的表中无序插入的行。我想知道是否可以在SQL中构建一个基于查询中其他行的查询,即
Select *
From table
Where InsertTime < previous row's InsertTime
Order by RowID
这大致可以满足我的要求,但就我有限的SQL知识而言,这是不可能的,相反,我必须运行查询的剩余部分,并在迭代行时手动进行测试。这是正确的吗?
如果有区别的话,这是在SQLite数据库中。
您可以通过相关子查询从上一行获取值,其中"上一行"表示具有下一个较小rowid的行,其中"下一个更小"实现为"较小的最大rowid":
SELECT *
FROM MyTable
WHERE InsertTime < (SELECT InsertTime
FROM MyTable AS T2
WHERE T2.rowid < MyTable.rowid
ORDER BY rowid DESC
LIMIT 1)
ORDER BY rowid
不幸的是,SQLite不支持使这类事情变得容易的CTE或窗口函数。如果你的订单是基于你的RowID的,你可以得到一个带有相关子查询的行号,这样做两次,然后将结果合并在一起,将行号偏移1:
SELECT t1.*
FROM (
SELECT Rowid, dt, (SELECT COUNT(rowid)
FROM table1 b
WHERE a.rowid >= b.rowid) as RN
FROM table1 a
)t1
JOIN (SELECT Rowid, dt, (SELECT COUNT(rowid)
FROM table1 b
WHERE a.rowid >= b.rowid) as RN
FROM table1 a
)t2
ON t1.RN = t2.RN +1
WHERE t1.dt < t2.dt
演示:SQL Fiddle