select * from mytable where date = max(date) This does not work. I hope my motive is clear. I know I can come around this problem by using sub-queries but is it possible to it without sub-query?
select * from mytable where date = max(date) This does not work. I hope my motive is clear. I know I can come around this problem by using sub-queries but is it possible to it without sub-query?
Subquery it is, unless you create your own function which can then be used directly in the WHERE clause. Otherwise, I don't think you can do that.
For example:
SQL> select ename, hiredate from emp order by hiredate desc; ENAME HIREDATE ---------- ---------- ADAMS 12.01.1983 --> that's the one we want SCOTT 09.12.1982 MILLER 23.01.1982 FORD 03.12.1981 JAMES 03.12.1981 <snip> The way you already know can be improved as following (why is it improved? Because it scans the table only once; your way, I presume, does it twice - once in a subquery (to find the MAX date value), and then once again in the main query):
SQL> with temp as 2 (select e.*, 3 rank() over (order by e.hiredate desc) rnk 4 from emp e 5 ) 6 select ename, hiredate 7 from temp 8 where rnk = 1; ENAME HIREDATE ---------- ---------- ADAMS 12.01.1983 (Option which isn't that good):
SQL> select ename, hiredate 2 from emp 3 where hiredate = (select max(hiredate) from emp); ENAME HIREDATE ---------- ---------- ADAMS 12.01.1983 SQL> Or, with your own function:
SQL> create or replace function f_maxhire return date is 2 retval date; 3 begin 4 select max(hiredate) into retval from emp; 5 return retval; 6 end; 7 / Function created. SQL> select ename, hiredate 2 from emp 3 where hiredate = f_maxhire; ENAME HIREDATE ---------- ---------- ADAMS 12.01.1983 SQL>