Нахождение максимального значения поля, доступного во всех таблицах - PullRequest
0 голосов
/ 29 октября 2019

Пример сценария: есть 5 таблиц и одно общее поле среди них - com_field (тип данных DATE). Теперь мне нужно найти максимум поля com_field в каждой из пяти таблиц. Кто-то может дать логику?

Я знаю, что UNION можно использовать, но мне нужна гибкость, чтобы не пропустить ни одной новой таблицы, добавленной к ВЛАДЕЛЬЦУ.

Я ожидаю получить следующий результат.

Table Max(com_field)
Tbl1  10/21/2019
Tbl2  10/18/2019
Tbl3  10/28/2019
Tbl4  09/30/2019
Tbl5  09/09/2019

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Запустите этот запрос:

 SELECT 
  'SELECT '''||OWNER||'.'||TABLE_NAME ||''' AS TABLE_NAME , '||'MAX(COM_FIELD)AS COM_FIELD FROM '  ||OWNER||'.'||TABLE_NAME ||' UNION ALL'
FROM ALL_TAB_COLUMNS
 WHERE COLUMN_NAME ='COM_FIELD'

, затем скопируйте outpu и удалите последнее ключевое слово union all. Затем запустите оператор sql.

Вы можете заказать его и посмотреть максимальное значение

0 голосов
/ 29 октября 2019

Одним из вариантов является использование динамического SQL в функции, которая возвращает refcursor. Вот пример.

Во-первых, контрольный пример:

SQL> create table taba (com_field date);

Table created.

SQL> create table tabb (com_field date);

Table created.

SQL> create table tabc (com_field date);

Table created.

SQL> insert all
  2    into taba values (sysdate)
  3    into taba values (sysdate - 2)
  4    into taba values (sysdate - 3)
  5    into tabb values (sysdate + 2)
  6    into tabc values (sysdate + 4)
  7    into tabc values (sysdate + 5)
  8  select * From dual;

6 rows created.

SQL>

Функция:

SQL> create or replace function f_maxcom
  2    return sys_refcursor
  3  is
  4    l_str varchar2(1000);
  5    rc    sys_refcursor;
  6  begin
  7    for cur_r in (select table_name
  8                  from user_tab_columns
  9                  where column_name = 'COM_FIELD'
 10                 )
 11    loop
 12      l_str := l_str ||
 13               'select ' || chr(39) || cur_r.table_name || chr(39) || ', ' ||
 14                'max(com_field) from ' || cur_r.table_name || ' union all ';
 15    end loop;
 16
 17    l_str := rtrim(l_str, ' union all');
 18
 19    open rc for l_str;
 20    return rc;
 21  end;
 22  /

Function created.

SQL>

Давайте попробуем:

SQL> select f_maxcom from dual;

F_MAXCOM
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

'TAB MAX(COM_FI
---- ----------
TABA 29.10.2019
TABB 31.10.2019
TABC 03.11.2019


SQL>

Добавить ещетаблица, чтобы увидеть, что происходит;функция останется как есть :

SQL> create table littlefoot (id number, com_field date);

Table created.

SQL> insert into littlefoot values (100, sysdate);

1 row created.

SQL> select f_maxcom from dual;

F_MAXCOM
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

'LITTLEFOO MAX(COM_FI
---------- ----------
LITTLEFOOT 29.10.2019
TABA       29.10.2019
TABB       31.10.2019
TABC       03.11.2019


SQL>

Кажется, все в порядке, а?

...