oracle数据库删除字段表中根据时间字段获得最新一条记录的最高效率sql写法是那样的?

从oracle数据库查询出的数据,按其中一个字段时间排序。查询语句该如何写?_百度知道
从oracle数据库查询出的数据,按其中一个字段时间排序。查询语句该如何写?
select * from T_SCHOOL_RECORDCOMMENT where RECORDID = :p_cid order by
to_date('COMMENTTIME','yyyy-mm-dd hh24:mi:ss') desc
这是查询语句
这是查询结果,但是时间排序是乱的,比如说我想刚发表的显示在第一行,然后依次排下去。该如何写这个查询语句...
我有更好的答案
yyyy-mm-dd hh24;) time from T_SCHOOL_RECORDCOMMENT where RECORDID = :p_cid)这样试试,这样好像很麻烦;COMMENTTIME&#39,但是你的时间字段用该保存为date类型:mi:ss',&#39select * from (select 除了时间所有字段写出来,to_date(&#39
&select*from('COMPANYID','ROCORDID','COMMENTBY','TITLE','CONTENT',to_date('COMMENTTIME','yyyy-mm-dd hh24:mi:ss') time from T_SCHOOL_RECORDCOMMENT where RECORDID = :p_cid) order by time desc&这样写报列名无效,
把你的表结构给我看一下吧
COMMENTTIME字段已经是date类型了,不需要做处理,直接select * from T_SCHOOL_RECORDCOMMENT where RECORDID = :p_cid order by
COMMENTTIME如果你是想改变时间格式,用alter session set nls_date_format='yy-mm-dd hh24:mi:ss';
谢谢哈,按你这么说的成功了。还有一个问题,就是一张表中是装的录音信息嘛,其中表有 一个PRAISECOUNT字段,意思是该条录音的推荐次数,还有一个字段是ISTOP,有两个值,0表示不置顶,1表示置顶。现在我前台页面aspx有一个repeater控件,目前是按推荐次数从高到低排序的,但是我想实现,前面先把置顶的行显示出来,再显示推荐次数从高到底的。这个怎么实现?
不客气 - -在排序的时候是可以写多个条件的,条件的优先级是按照书写顺序排列的你刚刚说的这个问题select * from table_A order by istop desc,
来自:求助得到的回答
采纳率:52%
最后说明一点,这个地方该使用升序方式(离当前时间最小的记录;&from&yyyymmddhh24miss')));代码是oracle数据库在pl/sql环境下写的&;:p_cid&order&by&(to_number(to_char())-to_number(to_char(COMMENTTIME,'T_SCHOOL_RECORDCOMMENT&nbsp,'yyyymmddhh24miss'&where&RECORDID&=&nbsp&select&*&nbsp
为您推荐:
其他类似问题
oracle数据库的相关知识
等待您来回答其他回答(8)
园豆:16511
SELECT column_name1,column_name2,
aggregate_function(column_name)
FROM table_name&
WHERE column_name operator value
GROUP BY column_name1,column_name2
select distinct [字段1],[字段2]..& from[表名]
你说的不够清楚,请把你需要展示出的效果给个图什么的
你是要查询出来是什么样子
1.select * from tab group by &你想用的字段& having count(0)&1 &--得到重复记录
2.&select *,ROW_NUMBER() over(partition by '你想用的字段' order by (select 0)) as rn
from t1 &--此时rn&1的就是重复的
A, B, C, DFROM
Table1WHERE
GROUP BY B, D))
园豆:6866
select * from tablename e&where e.rowid& in
select min(x.rowid) from tablename x where x.D字段 = e.D字段
这条语句的匹配机制是什么?
请问如果是两个字段唯一的多条记录相同,怎样支取一条记录呢?
&&&您需要以后才能回答,未注册用户请先。Oracle取得表中总记录数最快的方法_数据库技术_Linux公社-Linux系统门户网站
你好,游客
Oracle取得表中总记录数最快的方法
来源:Linux社区&
作者:Linux
查询表中的记录总数的语法就是SELECT COUNT(*) FROM TABLE_NAME。这可能是最经常使用的一类SQL语句。&本文讨论怎样才能最快的得到这个记录数。本文纯粹主要是理论上的讨论,文章中很多内容(如常数索引)对实际的指导意义不大。&在具体描述之前,强调几个前提:&首先表中的记录数不能太少,否则讨论的意义就不大了,在我下面的例子中记录数是3万左右,其实这个数量级还是比较小,不过已经能够看出一些效果了。&根据执行时间的长短进行判断偶然性比较大,本文以没种方法逻辑读的多少来进行判断。由于包括查询重写(需要的相对较多的执行计划的分析)和索引压缩(属于CPU密集型,消耗CPU资源较多),仅仅用逻辑读来衡量各种方法的优劣肯定不会很准确,但是考虑到表中的数据量比较大,而且我们以SQL的第二次执行结果为准,所以,其他方面的影响还是可以忽略的。&另外一个前提就是结果的准确性,查询USER_TABLES的NUM_ROWS列等类似的方法不在本文讨论范畴之内。&最后,由于的缓存和共享池的机制,SQL语句逻辑读一般从第二次执行才稳定下来,出于篇幅的考虑,下面所有的SELECT COUNT(*) FROM T的结果都是该SQL语句第二次执行的结果。&如果存在一个查询语句为SELECT COUNT(*)的物化视图,则最快的方式一定是扫描这张物化视图。&SQL& CREATE TABLE T (ID NUMBER NOT NULL, NAME VARCHAR2(30), TYPE VARCHAR2(18));&表已创建。&SQL& INSERT INTO T SELECT ROWNUM, OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS;&已创建30931行。&SQL& COMMIT;&提交完成。&SQL& CREATE MATERIALIZED VIEW LOG ON T WITH ROWID INCLUDING NEW VALUES;&实体化视图日志已创建。&SQL& CREATE MATERIALIZED VIEW MV_T REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS&2 SELECT COUNT(*) FROM T;&实体化视图已创建。&SQL& ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;&会话已更改。&SQL& EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')&PL/SQL 过程已成功完成。&SQL& SET AUTOT ON&SQL& SELECT COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=82 Bytes=1066)&1 0 TABLE ACCESS (FULL) OF 'MV_T' (Cost=2 Card=82 Bytes=1066)&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&3 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&根据上面的查询可以看出,扫描物化视图,只需3个逻辑读就可以了。但是,物化视图对系统的限制比较多。首先要创建物化视图日志,还要在SYSTEM或SESSION级设置参数,必须使用CBO等很多的条件,限制了物化视图的使用,而且最重要的是,一般情况下不会存在一个单纯查询全表记录数的物化视图,而一般建立的物化视图是为了加快一些更加复杂的表连接或聚集的查询的。因此,即使存在物化视图,也不会直接得到结果,一般是对物化视图上的结果进行再次计算。&如果不考虑物化视图,那么得到记录总数的最快的方法一定是BITMAP索引扫描。BITMAP索引的机制使得BITMAP索引回答COUNT(*)之类的查询具有最快的响应速度和最小的逻辑读。至于BITMAP索引的机制,这里就不重复描述了,还是看看BITMAP索引的表现吧:&SQL& DROP MATERIALIZED VIEW MV_T;&实体化视图已删除。&SQL& DROP MATERIALIZED VIEW LOG ON T;&实体化视图日志已删除。&SQL& CREATE BITMAP INDEX IND_B_T_TYPE ON T (TYPE);&索引已创建。&SQL& EXEC DBMS_STATS.GATHER_INDEX_STATS(USER, 'IND_B_T_TYPE')&PL/SQL 过程已成功完成。&SQL& SELECT COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1)&1 0 SORT (AGGREGATE)&2 1 BITMAP CONVERSION (COUNT)&3 2 BITMAP INDEX (FAST FULL SCAN) OF 'IND_B_T_TYPE'&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&5 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&可以看到,BITMAP索引的表现十分出色,只需5个逻辑读就可以得到结果。可惜的是,BITMAP索引比较适合在数据仓库中使用,而对于OLTP环境,BITMAP索引的锁粒度将给整个系统带来严重的灾难。因此,对于OLTP系统,BITMAP索引也是不合适的。&不考虑BITMAP索引,那么速度最快的应该是普通索引的快速全扫了,比如主键列。&SQL& DROP INDEX IND_B_T_TYPE;&索引已丢弃。&SQL& ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);&表已更改。&SQL& SELECT COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1)&1 0 SORT (AGGREGATE)&2 1 INDEX (FAST FULL SCAN) OF 'PK_T' (UNIQUE) (Cost=4 Card=30931)&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&69 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&主键的快速全扫只需69个逻辑读。但是由于主键这里用的是ROWNUM,也就是说是主键的值是从1到30931,Oracle存储这些NUMBER类型则需要2到4位不等。如果建立一个常数索引,则在存储空间上要节省一些。而在执行索引快速全扫时,就能减少一些逻辑读。&SQL& CREATE INDEX IND_T_CON ON T(1);&索引已创建。&SQL& SELECT COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1)&1 0 SORT (AGGREGATE)&2 1 INDEX (FAST FULL SCAN) OF 'IND_T_CON' (NON-UNIQUE) (Cost=4 Card=30931)&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&66 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&果然,扫描常数索引比扫描主键的逻辑读更小一些。考虑到NUMBER类型中,1的存储需要两位,而0的存储只需一位,那么用0代替1创建常数索引,应该效果更好。&SQL& CREATE INDEX IND_T_CON_0 ON T(0);&索引已创建。&SQL& SELECT /*+ INDEX(T IND_T_CON_0) */ COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)&1 0 SORT (AGGREGATE)&2 1 INDEX (FULL SCAN) OF 'IND_T_CON_0' (NON-UNIQUE) (Cost=26 Card=30931)&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&58 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&由于常数索引中所有节点值都相同,如果压缩一下的话,应该还能减少逻辑读。&SQL& DROP INDEX IND_T_CON_0;&索引已丢弃。&SQL& CREATE INDEX IND_T_CON_COMPRESS ON T(0) COMPRESS;&索引已创建。&SQL& SELECT /*+ INDEX(T IND_T_CON_COMPRESS) */ COUNT(*) FROM T;&COUNT(*)&----------&30931&Execution Plan&----------------------------------------------------------&0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)&1 0 SORT (AGGREGATE)&2 1 INDEX (FULL SCAN) OF 'IND_T_CON_COMPRESS' (NON-UNIQUE) (Cost=26 Card=30931)&Statistics&----------------------------------------------------------&0 recursive calls&0 db block gets&49 consistent gets&0 physical reads&0 redo size&378 bytes sent via SQL*Net to client&503 bytes received via SQL*Net from client&2 SQL*Net roundtrips to/from client&0 sorts (memory)&0 sorts (disk)&1 rows processed&和预计的一样,经过压缩,索引扫描的逻辑读进一步减少,现在和最初的主键扫描相比,逻辑读已经减少了30%。&如果只为了得到COUNT(*),那么压缩过的常数索引是最佳选择,不过这个索引对其他查询是没有任何帮助的,因此,实际中的用处不大。
更多Oracle相关信息见 专题页面
相关资讯 & & &
& (05/15/:22)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款职友集:让就业决策更聪明}

我要回帖

更多关于 oracle数据库添加字段 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信