Let us consider below tables to demonstrate filtering inner table in outer join
SQL> select * from t1; A B ---------- ---------- 1 10 2 20 3 30 3 rows selected. SQL> select * from t2; B C ---------- ---------- 20 200 30 300 40 400 3 rows selected.
This is regular outer join where t1 is outer (row preserving) table and t2 is inner (null supplying) table.
SQL> select a, t1.b t1_b, t2.b t2_b, c from t1 left outer join t2 on t1.b = t2.b; A T1_B T2_B C ---------- ---------- ---------- ---------- 2 20 20 200 3 30 30 300 1 10 3 rows selected.
Filter predicate in WHERE clause: It filters from result like below, after performing join operation.
SQL> select a, t1.b t1_b, t2.b t2_b, c from t1 left outer join t2 on t1.b = t2.b where t2.c=300; A T1_B T2_B C ---------- ---------- ---------- ---------- 3 30 30 300 1 row selected.
Filter predicate in join condition: It filters rows from inner (null supplying) table t2, before performing join operation.
SQL> select a, t1.b t1_b, t2.b t2_b, c from t1 left outer join t2 on t1.b = t2.b and t2.c=300; A T1_B T2_B C ---------- ---------- ---------- ---------- 3 30 30 300 2 20 1 10 3 rows selected.
Here are the equivalent SQLs in Oracle's dialect.
SQL> select a, t1.b t1_b, t2.b t2_b, c from t1, t2 where t1.b = t2.b(+) and t2.c=300; A T1_B T2_B C ---------- ---------- ---------- ---------- 3 30 30 300 1 row selected.
Observe (+) in filter predicate of t2 below, which actually filters rows before join operation.
SQL> select a, t1.b t1_b, t2.b t2_b, c from t1, t2 where t1.b = t2.b(+) and t2.c(+)=300; A T1_B T2_B C ---------- ---------- ---------- ---------- 3 30 30 300 2 20 1 10 3 rows selected.