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