这是我当前的查询:
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),但收集到的值和实际值之间可能会有某种差距。