2017-10-30 8 views
0

Ich versuche, eine Überprüfung aller Werte, die in einem bestimmten Zeitraum aus mehreren Tabellen geändert wurden. Gibt es eine einfachere Möglichkeit, das Folgende zu schreiben?SQL (Oracle) - Wie mehrere geänderte Werte aus mehreren Tabellen abfragen

select property_number, 'table1', count(*) 
    from table1 
    where start_date between to_date('07/01/2017','mm/dd/yyyy') and to_date('09/30/2017', 'mm/dd/yyyy') 
group by property_number 
union all 
    select property_number, 'table2', count(*) 
    from table2 
    where start_date between to_date('07/01/2017', 'mm/dd/yyyy') and to_date('09/30/2017', 'mm/dd/yyyy') 
group by property_number 
union all 
    select property_number, 'table3', count(*) 
    from table3 
    where start_date between to_date('07/01/2017', 'mm/dd/yyyy') and to_date('09/30/2017', 'mm/dd/yyyy') 
group by property_number 
union all 
    select property_number, 'table4', count(*) 
    from table4 
    where start_date between to_date('07/01/2017', 'mm/dd/yyyy') and to_date('09/30/2017', 'mm/dd/yyyy') 
group by property_number 
union all 
    select property_number, 'table5', count(*) 
    from table5 
    where start_date between to_date('07/01/2017', 'mm/dd/yyyy') and to_date('09/30/2017', 'mm/dd/yyyy') 
group by property_number 
+1

Möglicherweise nicht, da sich Daten in mehreren Tabellen befinden. Warum arbeitest du nicht mit ** einer ** Tabelle mit einem Indikatorfeld zur Unterscheidung? Ähnlich strukturierte Tabellen sollten niemals separate Objekte im Schema sein. Lernen Sie, die Effizienz, Skalierbarkeit und Wartbarkeit von Abfragen zu normalisieren. – Parfait

+1

Auf eine Nebenbemerkung: Wenn Sie Daten verwenden möchten, verwenden Sie keine Zeichenfolgenliterale und konvertieren Sie sie in Datumsangaben, sondern stattdessen Datumsliterale: 'where start_date zwischen Datum '2017-07-01' und Datum '2017-09-30'' . –

Antwort

2

Betrachten Sie ein CTE für eine DRY-er-Lösung.

WITH master_all AS 
    (SELECT property_number, 'table1' AS "indicator" 
    FROM table1 
    UNION ALL 
    SELECT property_number, 'table2' 
    FROM table2 
    UNION ALL 
    SELECT property_number, 'table3' 
    FROM table3 
    UNION ALL 
    SELECT property_number, 'table4' 
    FROM table4 
    UNION ALL 
    SELECT property_number, 'table5' 
    FROM table5) 

SELECT property_number, indicator, Count(*) AS "Audit_Count" 
FROM master_all 
WHERE start_date BETWEEN to_date('07/01/2017', 'mm/dd/yyyy') 
        AND to_date('09/30/2017', 'mm/dd/yyyy') 
GROUP BY property_number, indicator; 

Aber noch einmal, sollten Sie eine Einstellung Schema und fügen Sie alle ähnlich strukturierte Tabellen mit Anzeigefeld in einer Master-Tabelle.

+0

Danke! Ich musste die Häkchen von "Audit_count" entfernen und die Gruppe nach der where-Klausel verschieben, nur fyi. – lostinOracle

+0

Whoops! Das tut mir leid. Fest. Und schauen Sie, wie Sie die Tische zusammen migrieren ... und ersparen Sie sich eine Menge Schmerzen auf der Straße. Glückliche Datenbank. – Parfait

+0

Definitiv wird es tun. schätze die Hilfe. Btw es sollte 'table1' als Indikator und count (*) als Audit_Count sein – lostinOracle

Verwandte Themen