举个例子来说明问题,
oracle中有张TEST表,存放如下数据: ID SIGNVALUE
---------- ----------
1096 6.235E-006
1583 6.098E-006
ID 是个NUMBER型,SIGNVALUE 为float。
当我想查询,
SELECT * FROM TEST WHERE ID=1500;时
显然表中是没有该条记录,我希望实现:
当查询记录不存在的时候,返回上一条记录。即返回ID=1096的值。请问各位高手如何编写查询语句才能实现这样的功能。注:ID是插入记录时的系统时间与一个指定时间的差值(以秒为单位)。
实际表中有上千万条的记录。每个ID的差值都不确定,可能是1,也可能是几千。
oracle中有张TEST表,存放如下数据: ID SIGNVALUE
---------- ----------
1096 6.235E-006
1583 6.098E-006
ID 是个NUMBER型,SIGNVALUE 为float。
当我想查询,
SELECT * FROM TEST WHERE ID=1500;时
显然表中是没有该条记录,我希望实现:
当查询记录不存在的时候,返回上一条记录。即返回ID=1096的值。请问各位高手如何编写查询语句才能实现这样的功能。注:ID是插入记录时的系统时间与一个指定时间的差值(以秒为单位)。
实际表中有上千万条的记录。每个ID的差值都不确定,可能是1,也可能是几千。
解决方案 »
- OEM中无法启动实例
- 紧急求助,有没有将SQL Server的SQL翻译为Oracle的第三方组件?
- 如何执行一段动态的SQL语句,可返回结果集
- 关于数据库熟悉标准的问题
- 求一查询SQL语句?
- 请教一下个位高手,我用system/manager 或 sys/change_on_install启动数据库时会出现无法处理服务名的提示,在建完数据库后还需要其他设
- 有关24810的问题
- 哪位大侠知道 ORACLE内部培训视频教学22讲 的下载地址啊,,谢谢了,,下载到马上给分
- 兄弟请教,如何实现行号的自动加一(类似自动编号)
- 急!ASP.net连接Oracle9I的问题
- oracle无法启动
- 存储过程问题,大家帮看看!
改写一下你给的值就可以的出正确的结果。select * from test where id in (select max(id) from test where id < =1500)
但是我不希望使用这样的语句,因为表中的记录上千万。select MAX(ID).可能耗费太多时间。不是很使用。我感觉可以用游标,一次读取临近记录的记录快,如果记录不存在,移动一次游标就可以了,但是我刚学orace半个月,不知道怎么用。等待高手解答,或更好的建议。
select 1 from tb where id=1500;有什么用?没有用吧?
;
SQL> declare
2 rowa a%rowtype;
3 cursor c is select * from A;
4 v_id int:=0;
5 begin
6 open c;
7
8 loop
9 fetch c into rowa;
10 if c%found then
11
12 if rowa.id-v_id = 1 then
13 null;
14 else
15 dbms_output.put_line('得到的id值='||v_id);
16 end if;
17 v_id:= rowa.id;
18
19 else
20 exit;
21 end if;
22 end loop;
23 end;
24 /
得到的id值=1
得到的id值=4PL/SQL 过程已成功完成。
--Author: phenix;Time:9:46 2009-2-10
drop table test;
create table test(id number,signvalue float);
insert into test values(1096,6.235);
insert into test values(1583,6.098);
declare
cursor c is select * from test order by id;
v_pre c%rowtype;
v_next c%rowtype;
begin
open c;
loop
fetch c into v_next;
exit when(c%notfound);
if(v_next.id=1600) then
dbms_output.put_line(v_next.id||v_next.signvalue);
else
if(v_next.id>1600)then
dbms_output.put_line(v_pre.id||v_pre.signvalue);
end if;
end if;
v_pre:=v_next;
end loop;
if(v_next<1600)then
dbms_output.put_line(v_pre.id||v_pre.signvalue);
end if;
exception
when others then
dbms_output.put_line('不存在记录');
end;