2016-10-31 6 views
1

Ich habe eine Liste von Ansichten in zwei Schemas, in denen alles gleich ist mit Ausnahme der last_ddl_time.Oracle 12c Vergleichen last_ddl_time auf Ansichten

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; 

erzeugt die korrekten Daten, aber ich würde die SQL wie last_ddl_time zu vergleichen und Daten nur zurück, wenn die last_ddl_time für SC1 größer als last_ddl_time für SC2 ist.

Ich habe versucht, eine Unterabfrage zu erstellen, die die Vergleiche erstellt, aber kann die Syntax nicht erarbeiten, um die verglichenen Daten zu erstellen.

Das Objekt besteht darin, in SC2 aktualisierte Ansichten zu finden, bevor die Ansicht desselben Namens in SC1 aktualisiert wurde.

Alle und alle Vorschläge & Einsichten geschätzt.

+0

Bitte geben Sie Beispieldaten und das gewünschte Ergebnis an. –

Antwort

4

Sie können eine Inline-Ansicht (oder einen ähnlichen CTE) verwenden, die die DDL-Zeit für jedes Schema findet, z. mit einem Aggregat und Windowing-Klausel und die Suche nach folgenden Kriterien diese Werte in der äußeren Abfrage zu vergleichen:

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; 

Sie auch diese beiden DDL mal benutzen konnte zu zeigen, Side-by-side:

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

Perfekt !! Danke Alex. Wie ein Charme .. – user761758

2

Wenn Sie sicher, dass es dieselben Ansichten auf beiden Schemata ich einfach gehen würde Exklusionsverknüpfung

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

Kommas folgende last_ddl_time müssen weggehen, aber es funktioniert gut .. Danke !! – user761758

+0

@ user761758 Kommas entfernt. – Kacper

2

In Oracle 12 können Sie match_recognize verwenden. Das Beispiel stammt aus meiner Kopie von Oracle. Ich habe das SCOTT-Schema in mein eigenes (INTRO genannt) kopiert, also haben wir ein paar Objekte zum Testen.

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 

Wenn die last_ddl_time zu nicht-streng verglichen wurden (>= statt >), dann würden Sie nicht einmal brauchen den Vergleich in der Definition von i würde der Vergleich durch die order by Klausel betreut wird in .

Verwandte Themen