Эмуляция SELECT MAX FROM TABLE с курсором без использования функции MAX и ORDER BY - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужно эмулировать это, не используя функцию MAX и ORDER BY, просто используя курсор. Я думаю, что я должен использовать FETCH WHILE и FETCH или FOR, но безуспешно. Я буду помогать!

SELECT MAX(field) FROM table;

Поля - это всего 4 случайные буквы (A, B, C, D)

Поля таблицы:

A |  
B |  
C |  
D |  

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Вам действительно не нужен PL / SQL (если вы не практикуете, как им пользоваться). SQL может быть достаточно. Посмотрите на некоторые примеры:

Пример данных:

SQL> select * From test;

C
-
A
B
C
D

Один вариант:

SQL> select a.col
  2  from test a left join test b on a.col < b.col and b.col is not null
  3  where b.col is null;

C
-
D

SQL>

И другой:

SQL> select a.col
  2  from test a
  3  where a.col not in (select b.col
  4                      from test b join test c on b.col < c.col
  5                     );

C
-
D

SQL>
0 голосов
/ 01 апреля 2020

Если вы хотите, чтобы l oop превысило установленное значение, вы просто сохранили бы максимальное значение. Для ваших целей может быть адаптирован следующий шаблон:

DECLARE
  l_cMax my_table.field%TYPE;
  l_bFirstPass BOOLEAN := TRUE;
  CURSOR c_fieldValues IS
    SELECT m.field
    FROM my_table m;
BEGIN
  FOR rec IN c_fieldValues LOOP
    IF l_bFirstPass THEN
      l_cMax := rec.field;
      l_bFirstPass := FALSE;
    ELSIF rec.field > l_cMax THEN
      l_cMax := rec.field;
    END IF;
  END LOOP;
  dbms_output.put_line('Maximum Value is: '||l_cMax);
END;
/
...