Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle多列索引:确定最近的一对(年份、学期)_Sql_Oracle_Max - Fatal编程技术网

Sql Oracle多列索引:确定最近的一对(年份、学期)

Sql Oracle多列索引:确定最近的一对(年份、学期),sql,oracle,max,Sql,Oracle,Max,请假设Oracle表中有多列索引: CREATE INDEX MY_USER.MY_INDEX ON MY_USER.MY_TABLE (YEAR, SEMESTER); 第四列是年份。 专栏学期第一 确定最近几年、最近几学期最有效的方法是什么 我是这样想的: select max(YEAR) into MY_YEAR from MY_TABLE; select max(SEMESTER) from MY_TABLE where YEAR = MY_YEAR; 还有其他线索吗 非常感谢您考

请假设Oracle表中有多列索引:

CREATE INDEX MY_USER.MY_INDEX ON MY_USER.MY_TABLE
(YEAR, SEMESTER);
第四列是年份。 专栏学期第一

确定最近几年、最近几学期最有效的方法是什么

我是这样想的:

select max(YEAR) into MY_YEAR from MY_TABLE;

select max(SEMESTER) from MY_TABLE where YEAR = MY_YEAR;
还有其他线索吗

非常感谢您考虑我的请求

编辑:该表有超过5000万条记录

第二次编辑:我正在使用此Oracle版本:

BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0  Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.5.0 - Productio
NLSRTL Version 10.2.0.5.0 - Production

问:什么是最有效的方式来确定最近几年,学期

如果这是一个不需要优化的一次性查询,那么

选择MAXTO_CHARYEAR | | TO_CHARYEAR 从我的桌子上

这不是一个优雅的解决方案,但它是有效的。

如果学期数只能是1或2,这可能是有效的:

with t as
   (select max(year), 1 as semester
   from MY_TABLE
   where semester = 1
   union all
   select max(year), 2 as semester
   from MY_TABLE
   where semester = 2)
select MAX(TO_CHAR(YEAR) || TO_CHAR(SEMESTER)) 
from t;
当然,这不是一个通用的解决方案,但它应该适用于您的情况

更新:

另一个想法是:

SELECT year, semester
FROM MY_TABLE
ORDER BY year, semester 
FETCH FIRST 1 ROWS ONLY;

Oracle 12.1中引入了,如果我们采用Kevinsky的解决方案,并添加一个由两个字段串联而成的字段,该怎么办。然后我们可以在字段上添加索引

例如:

alter table MY_TABLE add (concatenated as TO_CHAR(YEAR) || TO_CHAR(SEMESTER))
CREATE INDEX MY_INDEX ON MY_TABLE(concatenated) 

这是两个完全不同的查询。请给出示例输入数据和预期输出。我不认为这是两个完全不同的查询。第一个查询计算MY_表中的maxYEAR。第二个查询确定MY_表中的MaxSerment,假设YEAR=MAXYEAR刚刚确定。选择YEAR,Serm from select YEAR,Serm,rownm as rn from MY_表中的order by YEAR desc,Serm desc,其中rn=1;一匹没有名字的马:它挂断了,因为整张桌子上的年份和学期总是一样的。。。。。现在!!如果它们总是相同的,那么为什么你需要找到最大值呢?随便你。如果所有的值都相同,索引也没有任何帮助。请使用解决方案完全访问表。它挂断了。我的_表有超过5000万条记录。刚刚添加了一个编辑行。我正在使用Oracle 10G。我刚刚编辑了我的问题并添加了此信息。我们可以创建基于函数的索引,而不是添加新列,但我会避免这样做。