这是我当前的查询:
SELECT c.COLUMN_NAME, t.NUM_ROWS
FROM ALL_TAB_COLUMNS c
INNER JOIN ALL_TABLES t ON t.OWNER = c.OWNER AND t.TABLE_NAME = c.TABLE_NAME
WHERE c.TABLE_NAME='MY_TABLE_NAME'
AND c.OWNER = 'MY_SCHEMA_NAME'
这是同时检索表中每一列的名称以及每一列的行数。
我需要做的是检索每列中存在的不同值的数量,然后最终确定哪一列具有最大数量的不同条目。给定当前查询,我该怎么做?
是否有更好的方法来实现我想做的事情?动态SQL是否必要?
您可以使用XMLQUERY
获取所需的结果。
Oracle数据设置:
SQL> CREATE TABLE TEST_SO (COL1 NUMBER, COL2 VARCHAR(20)); Table created. SQL> SQL> INSERT INTO TEST_SO (COL1,COL2) VALUES (1, 'TEJASH'); 1 row created. SQL> INSERT INTO TEST_SO (COL1,COL2) VALUES (2, 'TEJASH1'); 1 row created. SQL> INSERT INTO TEST_SO (COL1,COL2) VALUES (3, 'TEJASH2'); 1 row created. SQL> INSERT INTO TEST_SO (COL1,COL2) VALUES (2, 'TEJASH3'); 1 row created. SQL> INSERT INTO TEST_SO (COL1,COL2) VALUES (2, 'TEJASH'); 1 row created. SQL>
现在,COL2
具有4个不同的值,COL1
具有3个不同的值。使用以下查询来获取COL2
和4(因为它大于3(COL1
中的不同值))作为其中的不同值。
您的查询:
SQL> SELECT 2 C.COLUMN_NAME, 3 TO_NUMBER(XMLQUERY('/ROWSET/ROW/C/text()' 4 PASSING XMLTYPE(DBMS_XMLGEN.GETXML( 5 'select count(distinct "' 6 || C.COLUMN_NAME 7 || '") as c ' 8 || 'from "' 9 || C.TABLE_NAME 10 || '"')) RETURNING CONTENT)) AS DISTINCT_VALS 11 FROM USER_TAB_COLUMNS C 12 WHERE C.TABLE_NAME = 'TEST_SO' 13 ORDER BY DISTINCT_VALS DESC NULLS LAST 14 FETCH FIRST ROW WITH TIES; COLUMN_NAME DISTINCT_VALS --------------- ------------- COL2 4 SQL>
干杯!
自
一些可能的差异是可以接受的,您可以使用从all_tab_col_statistics收集的统计数据。像这样。
选择num_distinct,column_name来自all_tab_col_statistics其中table_name ='TABLE_NAME_UPPERCASE'按num_distinct desc排序取得带有关系的第一行;
同样,在可以接受的公差范围内,请使用此选项。尽管通常会定期收集表统计信息(取决于DBA),但收集到的值和实际值之间可能会有某种差距。