Как ограничить вывод следующего запроса только числом / целым типом данных путем объединения с ALL_TAB_COLS? - Oracle SQL - PullRequest
0 голосов
/ 20 января 2020

Необходим следующий запрос для вывода только имени столбца типа данных Число / Целое число? Как бы я ограничил вывод только указанным c типом данных?

select column_name, num_distinct 
from all_tab_col_statistics
where table_name = 'MY_TABLE_NAME'
order by num_distinct desc
fetch first row with ties;

Мне известно о том, что для этого требуется объединение с таблицей ALL_TAB_COLS, но я не уверен, как бы я это сделал реализовать это, учитывая мой текущий запрос.

Любая помощь будет оценена!

1 Ответ

1 голос
/ 20 января 2020

Присоедините ALL_TAB_COL_STATISTICS к ALL_TAB_COLUMNS, поскольку оно содержит типы данных столбцов.

Если вы хотите включить несколько таблиц, просто используйте предложение IN и назовите все интересующие вас таблицы.

Например:

SQL> select c.table_name, c.column_name, c.data_type, s.num_distinct
  2  from all_tab_columns c join all_tab_col_statistics s on
  3    s.table_name = c.table_name and s.column_name = c.column_name
  4  where c.table_name in ('EMP', 'DEPT')
  5    and c.data_type in ('NUMBER', 'VARCHAR2')
  6  order by c.table_name, c.column_name;

TABLE_NAME COLUMN_NAME     DATA_TYPE       NUM_DISTINCT
---------- --------------- --------------- ------------
DEPT       DEPTNO          NUMBER                     4
DEPT       DNAME           VARCHAR2                   4
DEPT       LOC             VARCHAR2                   4
EMP        COMM            NUMBER                     4
EMP        DEPTNO          NUMBER                     3
EMP        EMPNO           NUMBER                    14
EMP        ENAME           VARCHAR2                  14
EMP        JOB             VARCHAR2                   5
EMP        MGR             NUMBER                     6
EMP        SAL             NUMBER                    12

10 rows selected.

SQL>

Если вы хотите выбрать только столбцы с самыми высокими значениями NUM_DISTINCT для каждой таблицы, используйте текущий запрос в качестве CTE (общее выражение таблицы, также как выражение факторизации WITH), аналитической функции (например, RANK). ), чтобы найти те, которые вас интересуют. Что-то вроде этого:

SQL> with data as
  2    (select c.table_name, c.column_name, c.data_type, s.num_distinct,
  3            --
  4            rank() over (partition by c.table_name order by s.num_distinct desc) rnk
  5       from all_tab_columns c join all_tab_col_statistics s on
  6         s.table_name = c.table_name and s.column_name = c.column_name
  7       where c.table_name in ('EMP', 'DEPT')
  8         and c.data_type in ('NUMBER', 'VARCHAR2')
  9    )
 10  select table_name, column_name, data_type, num_distinct
 11  from data
 12  where rnk = 1;

TABLE_NAME COLUMN_NAME     DATA_TYPE       NUM_DISTINCT
---------- --------------- --------------- ------------
DEPT       LOC             VARCHAR2                   4
DEPT       DNAME           VARCHAR2                   4
DEPT       DEPTNO          NUMBER                     4
EMP        ENAME           VARCHAR2                  14
EMP        EMPNO           NUMBER                    14

SQL>

В нем говорится, что

  • в таблице DEPT, есть 3 столбца, которые разделяют то же значение MAX (4)
  • в таблице EMP, есть 2 таких столбца (значение MAX = 14)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...