我建了一张表,但是现在有的字段用不上了,我想删除这些字段,怎么用一个SQL语句就可以删除所有的空列,主要是我的表的字段有100个左右,空的也有20-30个,我不想一个一个的找,就想通过一个SQL语句实现,怎么办??? alter table tpucell drop column in (select column from tpucell where column is null); 上面是我写的语句,但是是错误的,请高手指教,谢谢!!!
最新回答
空自忆
2024-10-14 14:19:32
删除字段 ALTER TABLE table_NAME DROP COLUMN column_NAME 最主要的是你的代码中没有写你要删除的字段是哪个字段。 如果你不知道那个字段是否全部为空,那就先写一段代码查询一下那个字段的内容全部为空,把那些为空的字段记下来,再用上面的代码不就行了,ALTER TABLE table_NAME DROP COLUMN column_NAME1,column_NAME12,....,column_NAME20 这样可以吗?我这是个笨法,不过绝对实用。
好好做人
2024-10-14 10:15:52
************************************************************* 用下面这个plsql,能够达到你想要的效果,把表名写进去就可以了,注意只能执行一遍,删除列名后恢复不回来,想实现的话最好做好备份工作之后再试验。 ※:我已经测试过了。 ************************************************************* VAR P_CUR REFCURSOR BEGIN CURSOR CUR IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='大写表名'; V_CURSOR NUMBER; V_STRING VARCHAR(32765); COL_TMP VARCHAR(100); BEGIN V_STRING := 'ALTER TABLE 表名 SET UNUSED('; FOR REC IN CUR LOOP COL_TMP:=NULL; OPEN :P_CUR FOR 'SELECT DISTINCT '||REC.COLUMN_NAME||' FROM 表名'; FETCH :P_CUR INTO COL_TMP; IF COL_TMP IS NULL THEN V_STRING:=V_STRING||REC.COLUMN_NAME||','; END IF; END LOOP; V_STRING:=RTRIM(V_STRING,','); V_STRING:=V_STRING||')'; V_CURSOR := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(V_CURSOR,V_STRING,DBMS_SQL.NATIVE); V_STRING:='ALTER TABLE 表名 DROP UNUSED COLUMNS'; DBMS_SQL.PARSE(V_CURSOR,V_STRING,DBMS_SQL.NATIVE); DBMS_SQL.CLOSE_CURSOR(V_CURSOR); END; /
******************* 补充一下 ******************* 上面的总的指导思想是先用: alter table table_name set unused(column1,...)使NULL列名无效。 再用: alter table drop unused columns 删除无效列名。 上面的pl/sql涉及到了,动态DDL的执行。