2016-10-31 8 views
1

last_ddl_timeを除くすべてが等しいという2つのスキーマのビューのリストがあります。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; 

は、正しいデータを生成しますが、私はLAST_DDL_TIMEを比較し、SC1のためLAST_DDL_TIMEはSC2のためLAST_DDL_TIMEよりも大きい場合にのみ、データを返すためにSQLをしたいと思います。

私は比較を行うサブクエリを作成しようとしましたが、比較されたデータを生成するための構文を作り出すことができませんでした。

このオブジェクトは、SC1で同じ名前のビューが更新される前にSC2で更新されたビューを見つけることです。

任意のすべての提案&洞察が高く評価されました。

+0

サンプルデータと希望の結果を入力してください。 –

答えて

4

各スキーマのDDL時間を検出するインラインビュー(または同様のCTE)を使用できます。結果は外側のクエリでこれらの値を比較することにより、骨材とウィンドウ句、およびフィルタを使用して:

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

完璧!ありがとう、アレックス。魅力のように.. – user761758

2

あなたは確信している場合があり、私は内側のシンプルで行くと両方のスキーマに同じビューがあるOracleの12で

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

に参加、あなたはmatch_recognizeを使用することができます。この例は私のオラクルのコピーです。 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

関連する問題