DB对象名称捕获oracle数据库中以结尾的最后一个字符



我正在尝试捕获第一个字符搜索和最后一个字符搜索,并比较dba_objects中所有对象名称(表、视图、表分区、同义词…(的总计数匹配搜索,我在捕获所有对象名称时也遇到了类似的问题,但在本例中是第一个字符,所以我使用了这个查询

为了保持简单我的实际和明确的问题,请找到以下两个问题

Query1-从开始捕获数据库对象的计数

所有者计数-70678

对象名称计数-121341

对象类型-128322

SELECT
owner AS schema_name, --70,678
object_name, --1,21,341
object_type,--1,28,322
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '1') as BEGINNING,
count(*),
round(100*ratio_to_report(count(*)) over (), 4) percentage 
FROM
dba_objects 
GROUP BY
owner,
object_name,
object_type,
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '1') 
ORDER BY
percentage desc;

结果符合预期-满意

OBJECT_NAME       BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D   ABC       20      .00010
BBC_CUST_ENTRY_F  BBC       100     .030
FHS_PRDCT_STST_T  A$f       194     .031
GHS_INVTR_CD_DRY  A1B       493     .051

Query2-捕获使用结束的数据库对象的计数

所有者计数-71881

对象名称计数-121341

对象类型-128322

select
owner,--71,881
object_name,--1,21,341
object_type,--1,28,322
regexp_substr(object_name, '[^_]*$') ENDING,
count(*) COUNT,
--count(*) / sum(count(*)) over(partition by owner) ratio 
round(100*ratio_to_report(count(*)) over (), 4) percentage 
from
dba_objects 
group by
owner,
object_name,
object_type,
regexp_substr(object_name, '[^_]*$')
ORDER BY
percentage desc;

结果符合预期-满意

OBJECT_NAME       ENDING COUNT(*) PERCENT
ABC_CUST_INFO_D   D       20      .00010
BBC_CUST_ENTRY_F  F       100     .030
FHS_PRDCT_STST_T  T       194     .031
GHS_INVTR_CD_DRY  DRY     493     .051

因此,在重新访问这两个查询后,我能够比较计数,并注意到存在计数差异(1203计数(,如果我只按所有者检查计数,有人能告诉我为什么存在差异吗?

所以你能仔细检查一下,让我知道Query1和Query2使用的查询逻辑是正确的吗?

您的需求并不清楚。如果你想为每个所有者根据其名称的最后一部分(最后一个下划线后面的部分,或者如果根本没有下划线,则为整个名称(对对象进行计数,你可以这样做:

select owner, regexp_substr(object_name, '[^_]*$') ending, count(*) cnt,
count(*) / sum(count(*)) over(partition by owner) ratio
from dba_objects
group by owner, regexp_substr(object_name, '[^_]*$')

您可以很容易地调整查询以匹配类似的要求:例如,如果您希望按对象类型进行细分,您可以将object_type添加到窗口计数的selectgroup by子句以及partition by子句中。

请注意,如果对象的名称以下划线结尾,则ending将被计算为空字符串;这可能是,也可能不是你想要的。

您还提到了预期结果中的每个对象名称,您必须使用如下分析函数:

SELECT OBJECT_NAME,
Sbstr as ending,
Count(1) over (partition by sbstr) as "count(*)",
Count(1) over (partition by sbstr) / Count(1) over () as percentage
From
(select
object_name,
REGEXP_SUBSTR(OBJECT_NAME, '_([A-Z]+)$',1,1,null,1) as SBSTR
from
dba_objects 
Where 
REGEXP_LIKE(OBJECT_NAME, '_[A-Z]$') 
)

注意:这将返回每个以大写字符后跟_结尾的对象名称。

最新更新