2016-11-08 2 views
-2

ist es möglich, die unten angegebene Ausgabe von Tabelle 1 und Tabelle 2 Ich habe versucht, alle Joins wie Outer Join, links Join, rechts verbinden, aber die erforderliche Ausgabe wird nicht erreicht .please help me . DankeBeitreten Oracle SQL

+0

Sie 'Union' –

+4

können http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload- images-of-code-auf-so-wenn-eine-Frage stellen/285557 # 285557 –

+2

Hast du irgendwas probiert? Bitte posten Sie Ihren Code. Bearbeiten Sie Ihre Frage auch, um Daten als formatierten Text zu zeigen, nicht Bilder – Aleksej

Antwort

0

Diese leicht eine partition outer join erreicht werden können:

WITH table1 AS (SELECT 2014 yr, 'Main' division, 2000 amt FROM dual UNION ALL 
       SELECT 2015 yr, 'Main' division, 6000 amt FROM dual UNION ALL 
       SELECT 2016 yr, 'Main' division, 7000 amt FROM dual), 
    table2 AS (SELECT 2014 yr, 'Center' division, 100 amt FROM dual UNION ALL 
       SELECT 2015 yr, 'Center' division, 200 amt FROM dual UNION ALL 
       SELECT 2016 yr, 'Center' division, 350 amt FROM dual), 
-- end of mimicking your tables; you wouldn't need the above 
-- as you already have the tables. 
-- You will need the following subquery to define the years you're querying 
-- against, though. You can define this either in the WITH clause 
-- or as an inline view in the main SQL below 
     years AS (SELECT 2014 yr FROM dual UNION ALL 
       SELECT 2015 yr FROM dual UNION ALL 
       SELECT 2016 yr FROM dual UNION ALL 
       SELECT 2017 yr FROM dual) 
SELECT yrs.yr, 
     t.division, 
     NVL(t.amt, 0) amt 
FROM years yrs 
     LEFT OUTER JOIN (SELECT yr, division, amt FROM table1 
         UNION ALL 
         SELECT yr, division, amt FROM table2) t PARTITION BY (t.division) 
      ON yrs.yr = t.yr 
ORDER BY t.division, yrs.yr; 

     YR DIVISION  AMT 
---------- -------- ---------- 
     2014 Center   100 
     2015 Center   200 
     2016 Center   350 
     2017 Center   0 
     2014 Main   2000 
     2015 Main   6000 
     2016 Main   7000 
     2017 Main    0 
0

Ich mag die Abfrage nicht, aber ich denke, es wird Ihr Ergebnis geben. Wenn Sie Testdaten als Inserts zur Verfügung gestellt hätten, würde ich es testen.

with years as (select year from select year from table1 union select year from table2), 
    divisions as (select division from select division from table1 union select division from table2) 
select y.year, d.division, nvl(t1.amd, 0) 
    from years y cross join divisions d 
    left outer join table1 t1 on (y.year = t1.year and d.division = t1.division) 
union all 
select y.year, d.division, nvl(t2.amd, 0) 
    from years y cross join divisions d 
    left outer join table2 t2 on (y.year = t2.year and d.division = t2.division); 
+2

'y inner join d on (1 = 1)' wird ein CROSS JOIN genannt und es hat seine eigene Syntax, die besser für die Klarheit ist: 'y Kreuz verbinden d'. Außerdem ist der linke äußere Join über alle verteilbar; du kannst 'd kreuzen beitreten y kreuzen beitreten ' – mathguy

+0

@mathguy Danke, ja sollte es sein 'Kreuz beitreten' chaotische Gewohnheiten. Ich weiß, dass ich mit Union verbinden kann. Dies habe ich nur zur Klarheit getan. Aber vielleicht ist es nur für mich klarer;) – Kacper

+0

... und natürlich habe ich einen Tippfehler im Kommentar (den ich nicht bearbeiten kann) - am Ende sollte es 'y Cross beitreten d LEFT OUTER beitreten < ... >' {:-) – mathguy

0

Sie können UNION und LEFT OUTER JOIN wie folgt verwenden:

SELECT * FROM(
SELECT 
    DISTINCT 
    YEARS.YEAR, 
    NVL(T1.DIVISION, (SELECT MAX(DIVISION) FROM TABLE1 WHERE DIVISION IS NOT NULL)) DIVISION, 
    NVL(T1.AMT, 0) 
FROM 
(
    SELECT YEAR, DIVISION FROM TABLE1 
    UNION 
    SELECT YEAR, DIVISION FROM TABLE2 
) YEARS 
LEFT JOIN TABLE1 T1 
ON YEARS.YEAR = T1.YEAR 
) TAB1 
UNION ALL 
(
    SELECT 
    DISTINCT 
    YEARS.YEAR, 
    NVL(T2.DIVISION, (SELECT MAX(DIVISION) FROM TABLE2 WHERE DIVISION IS NOT NULL)) DIVISION, 
    NVL(T2.AMT, 0) 
    FROM 
    (
    SELECT YEAR, DIVISION FROM TABLE1 
    UNION 
    SELECT YEAR, DIVISION FROM TABLE2 
) YEARS 
    LEFT JOIN TABLE2 T2 
    ON YEARS.YEAR = T2.YEAR 
) 
ORDER BY 2 DESC, 1; 
1

Wenn Sie eine Verknüpfung und füllen Werte ausführen müssen, die für bestimmte Kombinationen von Werten nicht existieren, tritt Außen mit UNIONs sind wenig altmodisch in Oracle.

Die neuere Methode ist die "partitionierte äußere Verbindung".

Es gibt eine gute Schreib auf sie in der „SQL für Reporting und Analyse“ Führung nach oben: https://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW0072

Haben Sie einen Überblick über das, und wenn Sie nicht die richtige Syntax arbeiten können, dann fragen Sie vielleicht eine neue Frage konzentrierte sich auf die Verwendung von partitionierten äußeren Joins.