Külső join művelet: (+) =================== A (+) csak a WHERE után használható. A műveletet megelőző oszlop lesz a külső join oszlop. Vagyis ezen oszlop értékei helyett fog NULL értékeket szerepeltetni az Oracle a lekérdezésben, amennyiben a másik táblabeli sornak nincs párja. pl. SELECT ename, dname FROM emp, dept WHERE dept.deptno = emp.deptno (+) Ez vissza fogja adni azt az osztályt is, amelyiken nem dolgozik senki. Ha a két táblát összekapcsoló JOIN feltétel több oszlopot is tartalmaz, akkor a "(+)" jelet minden oszlop után ki kell tenni. A "(+)" jelet csak oszlopra lehet alkalmazni nem pedig tetszőleges kifejezésre, de egy kifejezésben szerepelhet "(+)" jellel megjelölt oszlop. "(+)" jellel megjelölt oszlop nem szerepelhet IN összehasonlításban (kivéve ha egy konstans van a zárójelben), nem hasonlítható össze SUBSELECT-tel, és a rá vonatkozó feltételt nem lehet OR-ral összekapcsolni más feltétellel. Egy SELECT utasításban egy táblát csak egy másikkal lehet külső join művelet segítségével összekötni. Nem lehet egyszerre mindkét táblára külső joint alkalmazni. Nem megengedett utasítások az alábbiak!!! ========================================= SELECT ename, dname FROM emp, dept WHERE dept.deptno = emp.deptno (+) OR emp.deptno=10 SELECT ename FROM emp WHERE emp.deptno (+) IN (SELECT deptno FROM dept) SELECT ename FROM emp WHERE emp.deptno (+) IN (10, 20) De megengedett az alábbi utasítás: ================================== SELECT ename FROM emp WHERE emp.deptno (+) IN (10) Példa: Van két táblánk A(O1, O2) és B(O1, O2). | 2 | B | | 3 | C | | 4 | D | | 4 | D | Lekérdezés: SELECT * FROM A, B, WHERE A.O1 = B.O1 (+) Az eredmeny: 2, 'B' NULL NULL 4, 'D' 4, 'D' Lekérdezés: SELECT * FROM A, B, WHERE A.O1 = B.O1 (+) AND B.O1 (+) > 5 Az eredmeny: 2, 'B' NULL NULL 4, 'D' NULL NULL Ha az utóbbi lekérdezés második feltételéből elhagyjuk a (+)-t akkor a lekérdezés nem ad vissza egy sort sem. Ez is mutatja, hogy a külső join oszlopot tartalmazó táblát azokban az összehasonlításokban ahova a (+) jelet kitettük, a rendszer szükség eseten kiegészíti egy "Joker" sorral, ami tetszőleges feltételnek eleget tesz. A szükség esetén itt azt jelenti, hogy csak akkor egészíti ki ha nincs olyan "rendes" sor, ami a feltételnek eleget tesz. Több táblára vonatkozóan is megadható külső join. JOIN új szintaxis ================= (9-estől használható az alábbi szintaxis a join műveletekre. Az OUTER kulcsszó opcionális) SELECT emp.* FROM emp JOIN dept ON emp.deptno <= dept.deptno SELECT emp.* FROM emp CROSS JOIN dept SELECT emp.* FROM emp NATURAL JOIN dept -- azonos nevű oszlopok alapján SELECT emp.* FROM emp JOIN dept USING (deptno) -- a megadott oszlopok alapján SELECT emp.* FROM emp NATURAL LEFT OUTER JOIN dept OUTER JOIN (9-estől használható az alábbi szintaxis, FULL OUTER JOIN is) SELECT dept.deptno, ename, dname FROM emp RIGHT OUTER JOIN dept ON emp.deptno = dept.deptno A külső join-olt táblának fogja a rendszer az összes sorát visszaadni, vagyis mintha a másik táblát egészítenénk ki "Joker" sorral. A fentivel ekvivalens az alábbi régi módszer: SELECT dept.deptno, ename, dname FROM emp, dept WHERE emp.deptno (+) = dept.deptno Érdemes megnézni az alábbi két ekvivalens lekérdezést is. SELECT dept.deptno, ename, dname, sal FROM emp, dept WHERE emp.deptno (+) = dept.deptno AND dept.deptno > 20 AND sal(+) > 1500 SELECT dept.deptno, ename, dname, sal FROM emp RIGHT OUTER JOIN dept ON emp.deptno = dept.deptno AND sal > 1500 WHERE dept.deptno > 20 Vagyis a fentieket összefoglalva, a WHERE utáni AND-el összekötött feltételek közül azokat, amelyekben szerepel a (+) jel JOIN feltételnek tekinti a rendszer, a többi feltételt pedig meghagyja a WHERE után, lásd az alábbi két ekvivalens példát. SELECT dept.deptno, ename FROM emp, dept WHERE emp.deptno (+) = dept.deptno AND ename (+) LIKE '%A%' AND dept.deptno >= 30 SELECT dept.deptno, ename FROM emp RIGHT OUTER JOIN dept ON (emp.deptno = dept.deptno AND ename LIKE '%A%') WHERE dept.deptno >= 30 Az alábbi példa azt mutatja meg, hogy hogyan lehet függvényben használni a (+) jelet. Az utána következő a vele ekvivalens másik szintaxist mutatja. SELECT dept.deptno, ename FROM emp, dept WHERE emp.deptno (+) = dept.deptno AND INSTR(ename (+),'A') > 0 AND dept.deptno >= 30 SELECT dept.deptno, ename FROM emp RIGHT OUTER JOIN dept ON (emp.deptno = dept.deptno AND INSTR(ename,'A') > 0) WHERE dept.deptno >= 30 Az alábbit viszont már nem lehetne a (+)-os szintaxissal kifejezni SELECT c.customer_id, c.o.order_id -- így is lehet az oszlopra hivatkozni (!) FROM oe.customers c FULL OUTER JOIN oe.orders o ON c.customer_id = o.customer_id WHERE c.customer_id BETWEEN 113 and 116 ORDER BY c.o.order_id NULLS FIRST Próbáljuk ki az alábbi lekérdezésben a (+) jelet áttenni a másik oldalra, illetve a LEFT|RIGHT|FULL kulcsszavakat. create table outer1(o1 number, o2 VARCHAR2(10)); insert into outer1 values(1, 'Egy'); insert into outer1 values(2, 'Ketto'); create table outer2(o1 number, o2 VARCHAR2(10)); insert into outer2 values(1, 'Egy'); insert into outer2 values(3, 'Harom'); select * from outer1 t1, outer2 t2 where t1.o1 (+) = t2.o1; select * from outer1 full outer join outer2 on outer1.o1 = outer2.o1;