2016-10-31 73 views
1

我有两个模式中的视图列表,其中除了last_ddl_time之外的所有内容都相等。Oracle 12c在视图中比较last_ddl_time

select owner, object_name, last_ddl_time 
from all_objects 
where object_type = upper('view') 
and owner in ('SC1', 'SC2') 
order by 2,1,3; 

产生正确的数据,但我想在SQL来last_ddl_time比较和返回数据仅当SC1的last_ddl_time比last_ddl_time为SC2大。

我已经尝试创建一个子查询,使比较,但不能得到的语法产生的比较数据。

目标是在SC1中更新相同名称的视图之前查找在SC2中更新的视图。

任何和所有建议&深表赞赏。

+0

请提供样品数据和所需的结果。 –

回答

4

您可以使用内联视图(或类似的CTE)来查找每个模式的DDL时间,例如,使用聚合和窗口子句和过滤器的结果通过在外部查询比较这些值:

select owner, object_name, last_ddl_time 
from (
    select owner, object_name, last_ddl_time, 
    max(case when owner = 'SC1' then last_ddl_time end) 
     over (partition by object_name) as sc1_time, 
    max(case when owner = 'SC2' then last_ddl_time end) 
     over (partition by object_name) as sc2_time 
    from all_objects 
    where object_type = 'VIEW' 
    and owner in ('SC1','SC2') 
) 
where sc1_time > sc2_time 
order by 2,1,3; 

你也可以用它来显示两个DDL倍并排侧:

select object_name, sc1_time, sc2_time 
from (
    select owner, object_name, 
    max(case when owner = 'SC1' then last_ddl_time end) 
     over (partition by object_name) as sc1_time, 
    max(case when owner = 'SC2' then last_ddl_time end) 
     over (partition by object_name) as sc2_time 
    from all_objects 
    where object_type = 'VIEW' 
    and owner in ('SC1','SC2') 
) 
where sc1_time > sc2_time 
and owner = 'SC1' 
order by 1; 
+0

完美!谢谢Alex。像一个魅力.. – user761758

2

如果你肯定有两个模式我会用简单的内部走同样的观点加入

with sc1 as (
    select owner, object_name, last_ddl_time 
     from all_objects 
     where object_type = 'VIEW' and owner = 'SC1'), 
    sc2 as (
    select owner, object_name, last_ddl_time 
     from all_objects 
     where object_type = 'VIEW' and owner = 'SC2') 
    select sc1.object_name, sc1.last_ddl_time from sc1 inner join sc2 
     on (sc1.object_name = sc.object_name) 
    where sc1.last_ddl_time > sc2.last_ddl_time; 
+0

逗号后面last_ddl_time需要消失,但它工作正常..谢谢! – user761758

+0

@ user761758逗号已移除。 – Kacper

2

在Oracle 12,可以使用match_recognize。这个例子来自我的Oracle副本;我将SCOTT模式复制到我自己的(称为INTRO),因此我们有几个对象进行测试。

select object_type, object_name, scott_last_ddl_time, intro_last_ddl_time 
from all_objects 
match_recognize (
    partition by object_type, object_name 
    order  by last_ddl_time 
    measures  s.last_ddl_time as scott_last_ddl_time, 
       i.last_ddl_time as intro_last_ddl_time 
    pattern  (s i) 
    define  s as s.owner = 'SCOTT', 
       i as i.owner = 'INTRO' and i.last_ddl_time > s.last_ddl_time 
) 
order by object_type, object_name, scott_last_ddl_time -- ORDER BY is optional 
; 

OBJECT_TYPE OBJECT_NAME SCOTT_LAST_DDL_TIME INTRO_LAST_DDL_TIME 
----------- ----------- ------------------- ------------------- 
INDEX  PK_DEPT  2016-10-05 18:18:34 2016-10-05 21:52:31 
INDEX  PK_EMP  2016-10-05 18:18:34 2016-10-05 21:52:31 
TABLE  BONUS  2016-10-05 18:18:35 2016-10-05 21:52:31 
TABLE  DEPT  2016-10-05 18:18:34 2016-10-05 21:52:33 
TABLE  EMP   2016-10-05 18:18:34 2016-10-05 21:52:34 
TABLE  SALGRADE 2016-10-05 18:18:35 2016-10-05 21:52:31 

6 rows selecte 

如果last_ddl_time是要比较非严格(>=而不是>),那么你甚至不需要在i定义的比较,比较会由order by条款被照顾match_recognize