【问题标题】:How to also select row count from following query? - Oracle SQL如何从以下查询中选择行数? - 甲骨文 SQL
【发布时间】:2020-02-26 15:43:45
【问题描述】:

还需要在 Oracle SQL 中使用以下查询选择行/记录计数。我该怎么做呢?

SELECT DISTINCT t.OWNER AS TABLE_SCHEMA, t.Table_Name, c.COLUMN_NAME, c.DATA_TYPE, 
                ( 
                    SELECT CASE WHEN cons.CONSTRAINT_TYPE = 'P' THEN 'Primary Key' ELSE NULL END 
                    FROM SYS.all_cons_columns cols 
                        INNER JOIN SYS.all_constraints cons ON cons.constraint_name=cols.constraint_name AND cons.constraint_type = 'P' 
                    WHERE cols.Column_name=c.column_name AND cols.TABLE_NAME=c.TABLE_NAME AND cols.OWNER=c.OWNER 
                ) AS CONSTRAINT_TYPE, c.DATA_PRECISION, c.DATA_SCALE 
                FROM SYS.ALL_TABLES t 
                    INNER JOIN SYS.all_tab_columns c ON c.TABLE_NAME=t.TABLE_NAME AND c.OWNER=t.OWNER
                WHERE t.OWNER = 'MY_SCHEMA_NAME' AND t.Table_Name = 'MY_TABLE_NAME'

【问题讨论】:

    标签: sql oracle rowcount


    【解决方案1】:

    如果您可以接受估计行数(其准确性取决于每个表的统计信息的新鲜度),您可以只使用来自ALL_TABLES 的列NUM_ROWS

    SELECT 
        t.OWNER AS TABLE_SCHEMA, 
        t.Table_Name, 
        c.COLUMN_NAME, 
        c.DATA_TYPE, 
        t.NUM_ROWS, --> here
        ...
    FROM all_tables t
    INNER JOIN all_tab_columns c ...
    

    请注意,DISTINCT 在这里似乎是多余的 - 您的查询会为表中的每一列生成一条记录。

    如果您确实需要准确的计数,那么您可以使用内联查询 - 但您需要对表名进行硬编码:

    SELECT 
        t.OWNER AS TABLE_SCHEMA, 
        t.Table_Name, 
        c.COLUMN_NAME, 
        c.DATA_TYPE, 
        (SELECT COUNT(*) FROM my_schema_name.my_table_name) no_rows,
        ...
    FROM all_tables t
    INNER JOIN all_tab_columns c ...
    WHERE t.OWNER = 'MY_SCHEMA_NAME' AND t.Table_Name = 'MY_TABLE_NAME'
    

    【讨论】:

    • 是否可以得到确切的数字?我得到的估计值似乎真的很遥远
    • @awdoibbbbbbb2:如果您更新表的统计信息,您将获得更准确的结果。我还更新了我的答案,提供了一个可以让您准确计数的解决方案。
    【解决方案2】:

    不确定您使用的是哪个 SQL,但您可能会将整个结果放入临时表中 喜欢

    INTO temp temp_table_count WITH NO LOG;
    
    SELECT COUNT(*) FROM temp_table_count;
    

    【讨论】:

    【解决方案3】:

    https://www.oracletutorial.com/oracle-basics/oracle-private-temporary-table/参考

    INSERT INTO ora$ppt_temp_table_count(ADD ALL COLUMNS HERE 
    COMMASEPARATED)
    SELECT col1, col2, col3
    FROM source_table
    WHERE condition; <-- your query
    
    SELECT COUNT(*) FROM ora$ppt_temp_table_count;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2020-07-17
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多