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
Antwort
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
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);
'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 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
... 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
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;
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.
- 1. Oracle SQL bedingte beitreten
- 2. Outer beitreten in Oracle sql
- 3. Beitreten derselben Tabelle zweimal in Oracle SQL
- 4. Oracle beitreten Dual-Datumsbereich
- 5. Oracle beitreten wählen Ergebnis
- 6. Oracle beitreten Ausgabe
- 7. Wie sollte ich diesen 3 SQL-Abfragen in Oracle beitreten?
- 8. listagg Oracle SQL Query, beitreten in der gleichen Tabelle
- 9. Oracle: von der Aktualisierung selbst beitreten
- 10. Komplexe SQL-Abfrage beitreten
- 11. Ausgabe SQL-Abfrage beitreten
- 12. sql beitreten klar php
- 13. sql links beitreten klärung
- 14. SQL Server: Beitreten
- 15. SQL-Fehler - beitreten
- 16. SQL beitreten oder was?
- 17. U-SQL - Beitreten BETWEEN
- 18. PL/SQL Cartesian Beitreten
- 19. SQL beitreten dritte Tabelle
- 20. sql - links beitreten - zählen
- 21. sql beitreten und minus
- 22. SQL Right Beitreten Problem
- 23. Beitreten T-SQL
- 24. SQL: PIVOT mit beitreten
- 25. Oracle beitreten 2 Tabellen auf derselben Spalte
- 26. Oracle nach links nicht in ersetzen beitreten
- 27. SQL-Abfrage Group_concat mit beitreten
- 28. Access SQL Aggregat mit beitreten
- 29. SQL - beitreten, ohne den Schlüssel
- 30. wie Tabellen beitreten sql server
Sie 'Union' –
können http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload- images-of-code-auf-so-wenn-eine-Frage stellen/285557 # 285557 –
Hast du irgendwas probiert? Bitte posten Sie Ihren Code. Bearbeiten Sie Ihre Frage auch, um Daten als formatierten Text zu zeigen, nicht Bilder – Aleksej