Присоедините 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)