查询从表中发现没有数据的列动态
问题描述:
我写了一个查询找到列,而不从动态表中的数据, 但其给出的输出只能用ROWNUM = 1,这也是不正确的,查询从表中发现没有数据的列动态
WITH x AS (SELECT column_name FROM all_tab_cols
WHERE OWNER='HR' AND table_name='EMPLOYEES' AND ROWNUM=1)
SELECT X.column_name,count(X.column_name)
FROM EMPLOYEES,X
/*CONNECT BY LEVEL <= (SELECT count(1) FROM all_tab_cols
WHERE OWNER='HR' AND table_name='EMPLOYEES')*/
group by X.column_name;
COLUMN_NAME COUNT(X.COLUMN_NAME)
------------------------------ ----------------------
EMPLOYEE_ID 20
当我尝试使用水平,使其动态失败,
WITH x AS (SELECT column_name FROM all_tab_cols
WHERE OWNER='HR' AND table_name='EMPLOYEES' AND ROWNUM=level)
SELECT X.column_name,count(X.column_name)
FROM EMPLOYEES,X
CONNECT BY LEVEL <= (SELECT count(1) FROM all_tab_cols
WHERE OWNER='HR' AND table_name='EMPLOYEES')
group by X.column_name;
Error at Command Line:14 Column:5 Error report: SQL Error: ORA-01788: CONNECT BY clause required in this query block 01788. 00000 - "CONNECT BY clause required in this query block"
CUDü纠正达到同样的查询?
答
你的查询有一些问题:
- 子查询中
with
条款不看到其他子查询level
, - 你不能使用
where rownum = 2
,你必须做出别名此列,从选择它内部查询,但是这部分不需要在你的情况下, - 如果你想检查所有的列,不需要分层suqbquery。
更正查询是:
with x as (
select column_name from all_tab_cols
where owner='HR' and table_name='EMPLOYEES')
select x.column_name, count(x.column_name) as cnt
from x, employees group by x.column_name;
...但它总是显示在employees
所有行的每一列的数量。因此,如果您想查找不填充所有数据的列,则需要动态解决方案。您可以在可变v_sql
添加类似...where ||'r.column_name' is null
:
declare
v_sql varchar2(1000);
v_num number;
begin
for r in (select column_name from all_tab_cols
where owner='HR' and table_name='EMPLOYEES'
order by column_id)
loop
v_sql := 'select count('||r.column_name||') from employees';
execute immediate v_sql into v_num;
dbms_output.put_line(rpad(r.column_name,30)||' '||v_num);
end loop;
end;
实例数据和输出:
create table employees (id number(3), name varchar2(10), hire_date date);
insert into employees values (1, 'John', trunc(sysdate));
insert into employees values (2, 'Paul', trunc(sysdate));
insert into employees values (3, 'Mark', trunc(sysdate)-1);
insert into employees values (4, 'Anna', null);
ID 4
NAME 4
HIRE_DATE 3