Первый вопрос: один столбец с нулевой строкой можно рассматривать как единственное (нулевое) значение, содержащее столбец. Но это может остаться вашим решением: приведенные ниже сценарии предоставляют решения в обоих направлениях. (На мой взгляд: нет. Пустые столбцы не являются столбцами с единственным (нулевым) значением)
Если вы хотите узнать (нулевые) значения для одной таблицы, вы можете сделать это с помощью count (столбца):
select count(column) from table
и когда count(column) = 0
, то столбец имеет только (нулевое) значение или не имеет значения. (Таким образом, вы не можете принять правильное решение).
например. В следующих трех таблицах (x
, y
и z
) есть следующие столбцы:
select * from x;
N_X M_X
---------------
100 (null)
200 (null)
300 (null)
select * from y;
N_Y M_Y
---------------
101 (null)
202 (null)
303 apple
select * from z;
N_Z M_Z
---------------
Счетчик () выбирает:
select count(n_x), count(m_x) from x;
COUNT(N_X) COUNT(M_X)
-----------------------
3 0
select count(n_y), count(m_y) from y;
COUNT(N_Y) COUNT(M_Y)
-----------------------
3 1
select count(n_z), count(m_Z) from z;
COUNT(N_Z) COUNT(M_Z)
-----------------------
0 0
Как видите, разница между x и y отображается, но вы не можете решить, что таблица z не имеет строк или содержит только (нулевые) значения.
Общее решение:
Я разделил схему и уровень БД, но основная идея распространена:
Уровень схемы: таблица текущего пользователя
Уровень БД: все пользователи или выбранная схема
Количество (ноль) в одном столбце:
all_tab_columns.num_nulls
(или: user_tab_columns, num_nulls
).
И нам нужны num_rows таблицы:
all_all_tables.num_rows
(или: user_all_tables.num_rows
)
Там, где num_nulls равняется num_rows, существуют только (нулевые) значения.
Во-первых, вам нужно запустить DBMS_STATS для обновления статистики.
на уровне базы данных:
exec DBMS_STATS.GATHER_DATABASE_STATS;
(может использовать много ресурсов)
на уровне схемы:
EXEC DBMS_STATS.gather_schema_stats('TRANEE',DBMS_STATS.AUTO_SAMPLE_SIZE);
(владелец = журавль)
-- column with zero row = column has only (null) values -> exclude num_nulls > 0 condition
-- column with zero row <> column has only (null) values -> include num_nulls > 0 condition
сценарии:
-- 1. current user
select
a.table_name,
a.column_name,
a.num_nulls,
b.num_rows
from user_tab_columns a, user_all_tables b
where a.table_name = b.table_name
and num_nulls = num_rows
and num_nulls > 0;
-- 2. chosen user / all user -> exclude the a.owner = 'TRANEE' condition
select
a.owner,
a.table_name,
a.column_name,
a.num_nulls,
b.num_rows
from all_tab_columns a, all_all_tables b
where a.owner = b.owner
and a.table_name = b.table_name
and a.owner = 'TRANEE'
and num_nulls = num_rows
and num_nulls > 0;
TABLE_NAME COLUMN_NAME NUM_NULLS NUM_ROWS
----------------------------------------------------
LEADERS COMM 4 4
EMP_ACTION ACTION 12 12
X M_X 3 3
Эти таблицы и столбцы имеют только (нулевые) значения в схеме Tranee.