Sql 获取oracle中特定行之后的下一行
我在想办法可靠地排到下一排。我有以下模式:Sql 获取oracle中特定行之后的下一行,sql,oracle,Sql,Oracle,我在想办法可靠地排到下一排。我有以下模式: id varchar(36), received_at timestamp(6) with time zone 此查询大部分时间都有效 SELECT * FROM receipt_emails WHERE id > '50e8340a-2db5-42c2-add8-81ba732e9123' ORDER BY RECEIVED_AT ASC FETCH NEXT 1 ROWS ONLY; 但有时候不是,我不知道为什么。现在数据库中有以下两行
id varchar(36),
received_at timestamp(6) with time zone
此查询大部分时间都有效
SELECT *
FROM receipt_emails
WHERE id > '50e8340a-2db5-42c2-add8-81ba732e9123'
ORDER BY RECEIVED_AT ASC
FETCH NEXT 1 ROWS ONLY;
但有时候不是,我不知道为什么。现在数据库中有以下两行
id | received_at
50e8340a-2db5-42c2-add8-81ba732e9123 | "2015-08-04 05:16:13.000000"
4744eb81-9233-462a-8ee6-43302ef85671 | "2015-08-04 05:17:53.000000"
执行上述查询将返回零结果。我希望得到id为
4744eb81-9233-462a-8ee6-43302ef85671
的行。我觉得这与查询的where
部分没有实现我的意图有关 我想这就是你想要的:
SELECT re.*
FROM receipt_emails re
WHERE received_at > (SELECT received_at
FROM receipt_emails re2
WHERE re2.id = '50e8340a-2db5-42c2-add8-81ba732e9123'
)
ORDER BY RECEIVED_AT ASC
FETCH NEXT 1 ROWS ONLY;
比较应该是时间戳,而不是id。当您请求大于
50e8…
的行时,为什么希望得到4744…
?与@Blorgbeard相同。字符串比较工作正常,但您的两个字符串id不在序列中,因此where id>。。。条款将第二行取消。您需要在>处对接收的\u进行测试…在字符字段的ASCII排序序列中,以“4”开头的ID位于您请求的以“5”开头的ID之前,因此,您得到的结果为零。我认为您缺少的可能是,orderby
没有修改where子句中
的行为。您可以将其想象为“首先获取ID>xxx的行,然后按yyy排序这些行”。不是“按yyy排序时,获取ID为xxx的行之后的行”。