2016-07-11 10 views
0

Diese Frage ist über Oracle 12.1.0.2 auf Aix 7.2.Orakel Sql Rückkehr zählen zusammen mit anderen Spalten

Ich habe 5 Tabellen und ich möchte diese Abfrage tun:

select owner, table_name, LAST_DDL_TIME, count(*) 
from dba_objects 
where owner = 'WAREHOUSE' 
and OBJECT_NAME in ('table1','table2','table3','table4','table5') 
and OBJECT_TYPE = 'TABLE' 

Ich möchte die drei Spalten in der SELECT-Klausel und die tatsächliche Anzahl der 5-Tabellen. Ich möchte dies in einer Abfrage tun, wenn möglich.

Wenn ich eine Gruppe nach Besitzer, Tabellenname, LAST_DDL_TIME hinzufüge, wird für jede Zeile der Wert 1 zurückgegeben.

Also meine Ergebnismenge ich so aussehen soll:

OWNER  OBJECT_NAME  LAST_DDL_TIME   COUNT(*) 
SCHEMA1  TABLE1   7/9/2016 3:47:27 PM  5932158 
SCHEMA1  TABLE2   7/9/2016 3:47:31 PM  432 
SCHEMA1  TABLE3   7/9/2016 3:47:15 PM  958741 
SCHEMA1  TABLE4   7/9/2016 3:47:31 PM  11298 
SCHEMA1  TABLE5   7/9/2016 3:47:15 PM  3645873385 
+0

"tatsächliche Anzahl von 5 Tabellen". Du meinst 5? Oder suchen Sie nach der Anzahl der Reihen? – ruudvan

+0

Warum brauchen Sie 'Eigentümer' in der Ausgabe, wenn Sie nach' owner = 'WAREHOUSE' filtern? Auch - Sie brauchen wirklich die aktuelle Anzahl (*) - zählt seit dem letzten Mal Statistiken gesammelt wurden nicht ausreichen? – mathguy

+0

Wenn Sie nur eine ungefähre Anzahl möchten, können Sie 'dba_tab_statistics.num_rows' verwenden. Wenn Sie die genaue Anzahl möchten, könnten Sie eine SQL-Funktion schreiben, um eine Zeilenanzahl zurückzugeben, wenn Sie den Eigentümer und Tabellenname als Parameter erhalten. Dann rufen Sie einfach die SQL-Funktion in Ihrer Auswahl auf. –

Antwort

-1

Ein Hack, mit nur einfache SQL und hartcodierte Eigentümer und Tabellennamen, ist unten dargestellt. Es sollte nicht verwendet werden, es sei denn, dies ist eine lebenslange Anforderung in einer Organisation.

Zum Testen verwendete ich SYS und einige Tabellen im SYS-Schema auf meinem Computer. Wenn Sie das hilfreich finden, können Sie es für Ihre Situation anpassen.

with 
    counts (table_name, ct) as (
     select 'ACCESS$'     , count(*) from SYS.ACCESS$    union all 
     select 'ALERT_QT'    , count(*) from SYS.ALERT_QT    union all 
     select 'APPLY$_CHANGE_HANDLERS' , count(*) from SYS.APPLY$_CHANGE_HANDLERS union all 
     select 'APPLY$_CONF_HDLR_COLUMNS', count(*) from SYS.APPLY$_CONF_HDLR_COLUMNS 
    ) 
select o.owner, o.object_name, o.last_ddl_time, c.ct 
from dba_objects o 
     inner join 
     counts c 
     on o.object_name = c.table_name 
where o.object_type = 'TABLE' 
    and o.owner = 'SYS' 
; 


OWNER OBJECT_NAME    LAST_DDL_T   CT 
-------- ------------------------- ---------- ---------- 
SYS  ACCESS$     2014-05-29  34698 
SYS  ALERT_QT     2014-05-29   0 
SYS  APPLY$_CHANGE_HANDLERS 2014-05-29   0 
SYS  APPLY$_CONF_HDLR_COLUMNS 2014-05-29   0 
0

Sie können einige XML-Magie verwenden, um dynamisches SQL in einfacher SQL-Abfrage auszuführen.

select owner, object_name, LAST_DDL_TIME, 
     to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||object_name||'"')),'/ROWSET/ROW/C')) as count 
from dba_objects 
where owner = 'WAREHOUSE' 
and OBJECT_NAME in ('table1','table2','table3','table4','table5') 
and OBJECT_TYPE = 'TABLE' 
Verwandte Themen