Outer join med fler än en tabell?
Jag har 5 tabeller som jag använder i en query. Jag vill lägga till en 6:e men informationen matchar bara vissa records i de andra tabellerna. Jag skulle vilja göra något som motsvarar en OUTER LEFT JOIN. Dvs lägga till alla records från dagens query och lägga till infon från tabell 6 i de fall där den finns. Men OUTER LEFT JOIN går bara att göra med 2 tabeller om jag förstått det rätt. Kan man göra någon form av query i query:n för att lösa detta?
/Henrik
Svara
Sv: Outer join med fler än en tabell?
Beskriv din datastruktur? KAn du skicka med din fråga? Vad använder du för databas?
Svara
Sv: Outer join med fler än en tabell?
Så här ser frågan ut:
SELECT DISTINCT sstatp.sm_no, sm.sm_name, sstatp.cu_no, cu.cu_name, sstatp.art_no, art.art_descr, pgr.prod_group, pgr.prod_group_descr, sstatp.ord_qty, sstatp.ord_revenue, sstatp.ord_cost, sstatp.inv_qty, sstatp.inv_revenue, sstatp.inv_cost, sstatp.century, sstatp.stat_per, sstatp.st_loc, sstatp.cons_no, scost.mtrl_cost, scost.mfg_cost, scost.mtrl_oh_cost_var+scost.mfg_oh_cost_var, scost.mtrl_oh_cost_fix+scost.mfg_oh_cost_fix+scost.mach_cost_fix, scost.std_price
FROM guda.art art, guda.cu cu, guda.pgr pgr, guda.scost scost, guda.sm sm, guda.sstatp sstatp
WHERE art.art_no = sstatp.art_no AND sstatp.st_loc = art.st_loc AND sstatp.sm_no = sm.sm_no AND art.prod_group = pgr.prod_group AND sstatp.cu_no = cu.cu_no AND art.art_no = scost.art_no AND ((sstatp.century>19) AND (pgr.prod_group=2020) AND (sstatp.stat_per<9000 And sstatp.stat_per>300) OR (sstatp.century=20) AND (pgr.prod_group=2020) AND (sstatp.stat_per<9000 And sstatp.stat_per>300))
I tabell scost finns det information som inte matchar de andra tabeller helt och hållet. Jag skulle alltså vilja få med infon från denna tabell i de fall där den finns och i övrigt lämna blankt.
Vi kör detta i en Oracledatabas.
/Henrik
Svara
Sv: Outer join med fler än en tabell?
SELECT DISTINCT sstatp.sm_no, sm.sm_name, sstatp.cu_no, cu.cu_name, sstatp.art_no, art.art_descr, pgr.prod_group, pgr.prod_group_descr, sstatp.ord_qty, sstatp.ord_revenue, sstatp.ord_cost, sstatp.inv_qty, sstatp.inv_revenue, sstatp.inv_cost, sstatp.century, sstatp.stat_per, sstatp.st_loc, sstatp.cons_no, scost.mtrl_cost, scost.mfg_cost, scost.mtrl_oh_cost_var+scost.mfg_oh_cost_var, scost.mtrl_oh_cost_fix+scost.mfg_oh_cost_fix+scost.mach_cost_fix, scost.std_price
FROM guda.art art, guda.cu cu, guda.pgr pgr, guda.scost scost, guda.sm sm, guda.sstatp sstatp
WHERE art.art_no = sstatp.art_no AND sstatp.st_loc = art.st_loc AND sstatp.sm_no = sm.sm_no AND art.prod_group = pgr.prod_group AND sstatp.cu_no = cu.cu_no AND ((sstatp.century>19) AND (pgr.prod_group=2020) AND (sstatp.stat_per<9000 And sstatp.stat_per>300) OR (sstatp.century=20) AND (pgr.prod_group=2020) AND (sstatp.stat_per<9000 And sstatp.stat_per>300))
AND art.art_no = scost.art_no (+)
Jag är inte helt säker på OUTER LEFT JOIN syntaxen i Oracle (är det 9i du kör så rekommenderar jag dig att skriva ANSI join-syntax istället), men om jag fattar frågan rätt så är det väl bara att lägga till outer join villkoret till joinen mellan art och scost? Jag har flyttat det till slutet för att det ska vara lättare att se. Bara för att det är flera tabeller inblandade i en fråga innebär det inte att alla tabeller joinas mot alla andra tabeller, varje join görs mellan de tabeller som anges i joinvillkoret.
Svara
Sv: Outer join med fler än en tabell?
Du kan joina hur många tabeller du vill - så länge databasen orkar med.
Om du tycker det blir invecklad syntax, så kan du göra vyer och lägga till en ny tabell för varje vy.
Jag har visserligen bara använt en äldre Oracle, men hette inte det inte += eller =+ i Oracle det som heter LEFT OUTER JOIN i MS- SQL-Server?
Svara