如何选择包含最大数量不同值的列名? -Oracle SQL

问题描述 投票:1回答:2

这是我当前的查询:

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是否必要?

sql oracle distinct dynamic-sql dbvisualizer
2个回答
2
投票

您可以使用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>

干杯!


0
投票

  • 您已经准备好使用all_%视图中的num_rows和
  • 如果您收集了统计数据,并且
  • 一些可能的差异是可以接受的,您可以使用从all_tab_col_statistics收集的统计数据。像这样。

    选择num_distinct,column_name来自all_tab_col_statistics其中table_name ='TABLE_NAME_UPPERCASE'按num_distinct desc排序取得带有关系的第一行;

同样,在可以接受的公差范围内,请使用此选项。尽管通常会定期收集表统计信息(取决于DBA),但收集到的值和实际值之间可能会有某种差距。

© www.soinside.com 2019 - 2024. All rights reserved.