Найдите MAX (PK_COLUMN) и отобразите его с соответствующим именем таблицы - PullRequest
0 голосов
/ 12 октября 2019

У меня есть 20 таблиц (каждая таблица имеет PK и data), я хочу узнать, каково текущее значение MAX(PK) для каждой таблицы. Я хочу получить следующий результат:

TABLE_NAME              MAX_VAL
-------------------- ----------
TABELE_A                    114 
TABELE_B                     55 
TABELE_C                     14 
TABELE_D                    866 
TABELE_3                   4552

Есть ли способ сделать это, или я должен написать 20 раз SELECT MAX(PK_COL) FROM TABLE?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Я нашел другой метод, который вызовет TABLE_NAME, PK_COLUMN и MAX (PK_COLUMN).

SELECT CASE
         WHEN RN = 1 THEN
          FORMATTED_QUERY_SET
         ELSE
          FORMATTED_QUERY_SET || ' UNION ALL '
       END AS FORMATTED_QUERY_SET
  FROM (SELECT ' SELECT NVL(MAX( ' || COL.COLUMN_NAME ||
               ' ),0) CURR_MAX_VAL, ''' || TAB.TABLE_NAME ||
               ''' TABLE_NAME,''' || COL.COLUMN_NAME ||
               ''' COLUMN_NAME FROM  ' || TAB.TABLE_NAME AS FORMATTED_QUERY_SET,
               TAB.TABLE_NAME,
               ROW_NUMBER() OVER(ORDER BY TAB.TABLE_NAME DESC) AS RN
          FROM USER_CONSTRAINTS TAB
          JOIN USER_CONS_COLUMNS COL
            ON TAB.TABLE_NAME = COL.TABLE_NAME
          JOIN USER_TAB_COLUMNS COL2
            ON COL.COLUMN_NAME = COL2.COLUMN_NAME
           AND COL.TABLE_NAME = COL2.TABLE_NAME
         WHERE TAB.CONSTRAINT_TYPE = 'P'
           AND COL.CONSTRAINT_NAME LIKE '%_PK'
           AND REGEXP_LIKE(COL2.DATA_TYPE, ('NUMB|INTE')))
 ORDER BY TABLE_NAME;

Скопируйте выходные данные, возвращенные вышеупомянутым запросом, и выполните. Примечание. Удалите последний оператор «UNION ALL» из строки запроса. Примечание. Пожалуйста, исправьте меня, если я делаю что-то не так.

1 голос
/ 12 октября 2019

Если ваша подключенная схема состоит из этих двадцати таблиц, каждая из которых имеет одинаковое имя столбца первичного ключа (pk_col), то рассмотрим следующий блок кода, содержащий неявный курсор:

declare
  v_max pls_integer;
begin
    dbms_output.put_line('table_name    max_val');
  for c in ( select * from user_tables )
  loop
    execute immediate 'select max(pk_col) from '||c.table_name into v_max;
    dbms_output.put_line(c.table_name||'    '||v_max);
  end loop;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...