0

另一个在现实世界中绝对没有地位的学术任务......这就是我必须做的:

• 使用带有接受汽车注册参数的显式光标来查找最近在汽车上进行的预订。您必须在此处查看 I_BOOKING 表中的 date_reserved 列。您不能使用 MAX 功能。比较所有相关日期以找到最近的日期。

老实说,我不知道如何在 MAX(或其他)功能之外执行此操作。

到目前为止,我有这个:

CURSOR reg_cr (registration VARCHAR2) IS
SELECT GREATEST (date_reserved)
FROM i_booking;
v_reg reg_cr%ROWTYPE;

如果有人能指出我正确的方向,我将不胜感激。

4

3 回答 3

2

几种只返回一条记录的方法:

SELECT date_reserved
FROM   (SELECT * FROM i_booking
        ORDER BY date_reserved DESC)
WHERE  ROWNUM = 1;

SELECT DISTINCT
       FIRST_VALUE(date_reserved)
       OVER (ORDER BY date_reserved DESC)
FROM   i_booking;

SELECT date_reserved
FROM   (SELECT date_reserved
              ,ROW_NUMBER() OVER (ORDER BY date_reserved DESC)
               AS the_rn
        FROM   i_booking)
WHERE  the_rn = 1;

此方法可能会返回多行(如果第一名出现平局):

SELECT date_reserved
FROM   (SELECT date_reserved
              ,RANK() OVER (ORDER BY date_reserved DESC)
               AS the_rank
        FROM   i_booking)
WHERE  the_rank = 1;

wildplasser 的回答也展示了这个特性。

于 2013-10-16T02:33:55.497 回答
1

尽管任务的措辞似乎并没有明确排除使用不同的内置函数,但在我看来,精神似乎是在寻找一种暴力方法来循环所有日期值 - 特别是从“比较所有相关日期的部分,尽管这仍然模棱两可。我想,这也取决于你已经学到了什么。

所以这是我对我认为任务的内容的看法:

set serveroutput on
declare
  cursor reg_cur (registration i_booking.registration%type) is
    select date_reserved
    from i_booking
    where registration = reg_cur.registration;
  max_date date;
begin
  for reg_row in reg_cur('<reg value>') loop
    if max_date is null or reg_row.date_reserved > max_date then
      max_date := reg_row.date_reserved;
    end if;
  end loop;
  dbms_output.put_line('Most recent date is: ' || to_char(max_date, 'YYYY-MM-DD'));
end;
/

这会跟踪迄今为止看到的最新日期,并在循环的每次迭代中检查当前光标值是否更新。当然,这是非常做作的,但这似乎是你所期待的。

也不清楚你应该如何处理这个值。dbms_output也不适合这里的任何现实世界使用,所以也许你想要一个功能;这是函数形式的相同方法的SQL Fiddle

于 2013-10-16T09:38:40.533 回答
1

最大值的意思是:没有对应的记录值更高:

SELECT *
FROM orders oo                       -- all orders
WHERE NOT EXISTS (                   -- for which there does not exist
   SELECT * FROM orders nx           -- an order from
   WHERE nx.client_id = oo.client_id -- the same client
   AND nx.order_date > oo.order_date -- ,but with a more recent date
   ); 
于 2013-10-16T10:19:36.257 回答