A, A2Z and Z that I want to outer join from left to right:
The first table, A, contains the (primary keys) 1 through 7. I want my select to return each of these, that's why I use an outer join.
A's column i is outer joined to A2Z's column ia:
A.i = A2Z.ia (+).
The
(+) symbol indicates that a record should be returned even if there is no matching record. Note, the (+) is on the side of the = where "missing" records are expected.
Now, the records in A2Z should be joined to Z if A2Z's column flg is equal to y (colored green in the graphic above). For example, for the 1 in A, I expected the query to return the a in Z, for the 2 in A I expect no matching record in Z since the corresponding flg is either null or not equal to y.
This requirement can be implemented with a
A2Z.flg (+) = 'y'
Note, the (+) is on the side where missing records (or null values) are expected. Since y is neither missing nor null, it goes to the other side.
Finally, A2Z needs to be joined to Z:
A2Z.iz = Z.i (+)
Complete SQL Script
create table A (i number(1) primary key);
create table Z (i char (1) primary key);
create table A2Z (
ia not null references A,
flg char(1) not null,
iz char(1) not null
);
insert into A values (1);
insert into A values (2);
insert into A values (3);
insert into A values (4);
insert into A values (5);
insert into A values (6);
insert into A values (7);
insert into Z values ('a');
insert into Z values ('b');
insert into Z values ('c');
insert into Z values ('d');
insert into A2Z values (1, 'y', 'a' );
insert into A2Z values (1, 'n', 'b' );
insert into A2Z values (2,null, 'c' );
insert into A2Z values (2, 'q', 'd' );
insert into A2Z values (3, 'y', 'e' );
insert into A2Z values (4, , 'f' );
insert into A2Z values (5, 'y', null);
insert into A2Z values (6, 'v', null);
select
A.i a_i,
Z.i z_i
from
A, A2Z, Z
where
A.i = A2Z.ia (+) and
A2Z.flg (+) = 'y' and
A2Z.iz = Z.i (+)
order by
A.i;
drop table A2Z purge;
drop table Z purge;
drop table A purge;
When run, the select returns the following records:
A_I Z
---------- -
1 a
2
3
4
5
6
7
Links
Source code on github
No comments:
Post a Comment