一对多关系查询表:
ea,eb,ga,gb
表关系如下
ea1=eb1
ga1=gb1
eb1=gb31 and eb3 = gb33
事例数据及关系如下:SELECT ea1, eb3, gb1, gb3, gb31, gb33
FROM (SELECT 'G1' gb1, '1' gb3, 'E1' gb31, '1' gb33
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) gb,
(SELECT 'G1' ga1
FROM dual
UNION ALL
SELECT 'G2'
FROM dual
UNION ALL
SELECT 'G3' FROM dual) ga,
(SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual) eb,
(SELECT 'E1' ea1 FROM dual) ea
WHERE ea1 = eb1
AND ga1 = gb1
AND eb1 = gb31
AND eb3 = gb33
AND ea1 = 'E1'
ORDER BY ea1, eb3, gb1, gb3执行结果: EA1 EB3 GB1 GB3 GB31 GB33
1 E1 1 G1 1 E1 1
2 E1 2 G1 2 E1 2
3 E1 3 G1 4 E1 3
4 E1 3 G2 4 E1 3期望结果: EA1 EB3 GB1 GB3 GB31 GB33
1 E1 1 G1 1 E1 1
2 E1 2 G1 2 E1 2
3 E1 3 G1 4 E1 3
4 E1 3 G2 4 E1 3
5 E1 4
6 E1 5SQL应该如何去修改,才能得到上面的结果
ea,eb,ga,gb
表关系如下
ea1=eb1
ga1=gb1
eb1=gb31 and eb3 = gb33
事例数据及关系如下:SELECT ea1, eb3, gb1, gb3, gb31, gb33
FROM (SELECT 'G1' gb1, '1' gb3, 'E1' gb31, '1' gb33
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) gb,
(SELECT 'G1' ga1
FROM dual
UNION ALL
SELECT 'G2'
FROM dual
UNION ALL
SELECT 'G3' FROM dual) ga,
(SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual) eb,
(SELECT 'E1' ea1 FROM dual) ea
WHERE ea1 = eb1
AND ga1 = gb1
AND eb1 = gb31
AND eb3 = gb33
AND ea1 = 'E1'
ORDER BY ea1, eb3, gb1, gb3执行结果: EA1 EB3 GB1 GB3 GB31 GB33
1 E1 1 G1 1 E1 1
2 E1 2 G1 2 E1 2
3 E1 3 G1 4 E1 3
4 E1 3 G2 4 E1 3期望结果: EA1 EB3 GB1 GB3 GB31 GB33
1 E1 1 G1 1 E1 1
2 E1 2 G1 2 E1 2
3 E1 3 G1 4 E1 3
4 E1 3 G2 4 E1 3
5 E1 4
6 E1 5SQL应该如何去修改,才能得到上面的结果
WHERE ea1 = eb1(+)
结果还是:
EA1 EB3 GB1 GB3 GB31 GB33
1 E1 1 G1 1 E1 1
2 E1 2 G1 2 E1 2
3 E1 3 G1 4 E1 3
4 E1 3 G2 4 E1 3
SELECT ea1, eb3, gb1, gb3, gb31, gb33
FROM (SELECT 'G1' gb1, '1' gb3, 'E1' gb31, '1' gb33
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) gb
inner join
(SELECT 'G1' ga1
FROM dual
UNION ALL
SELECT 'G2'
FROM dual
UNION ALL
SELECT 'G3' FROM dual) ga
on ga1 = gb1
right join
(SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual) eb
on eb1 = gb31 AND eb3 = gb33
left join
(SELECT 'E1' ea1 FROM dual) ea
on ea1 = eb1
ORDER BY ea1, eb3, gb1, gb3
SQL> select ea.ea1,eb.eb3,gb.* from eb,gb,ea
2 where eb.eb1=gb.gb31(+) and eb.eb3=gb.gb33(+) and eb.eb1=ea.ea1
3 /
EA1 EB3 GB1 GB3 GB31 GB33
--- --- --- --- ---- ----
E1 1 G1 1 E1 1
E1 2 G1 2 E1 2
E1 3 G1 4 E1 3
E1 3 G2 4 E1 3
E1 4
E1 5
6 rows selected
SQL>
SQL> select ea.ea1, eb.eb3, gb.*
2 from eb, gb, ea, ga
3 where eb.eb1 = gb.gb31(+)
4 and eb.eb3 = gb.gb33(+)
5 and eb.eb1 = ea.ea1
6 and gb.gb1 = ga.ga1(+)
7 order by 1, 2
8 /
EA1 EB3 GB1 GB3 GB31 GB33
--- --- --- --- ---- ----
E1 1 G1 1 E1 1
E1 2 G1 2 E1 2
E1 3 G2 4 E1 3
E1 3 G1 4 E1 3
E1 4
E1 5
6 rows selected
from
ea left outer join eb on ea1=eb1
left outer join gb oneb1=gb31 and eb3 = gb33
inner join ga on ga1=gb1
with gb as (SELECT 'G1' gb1, '1' gb3, 'E1' gb31, '1' gb33
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) ,
ga as (SELECT 'G1' ga1
FROM dual
UNION ALL
SELECT 'G2'
FROM dual
UNION ALL
SELECT 'G3' FROM dual),
eb as (SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual),
ea as (SELECT 'E1' ea1 FROM dual)
select ea.ea1, eb.eb3, gb.*
from eb, gb, ea, ga
where eb.eb1 = gb.gb31(+)
and eb.eb3 = gb.gb33(+)
and eb.eb1 = ea.ea1
and gb.gb1 = ga.ga1(+)
order by 1, 2
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) ,
ga as (SELECT 'G1' ga1
FROM dual
UNION ALL
SELECT 'G2'
FROM dual
UNION ALL
SELECT 'G3' FROM dual),
eb as (SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual),
ea as (SELECT 'E1' ea1 FROM dual)
select ea.ea1,eb.eb3,gb.*
from
ea left outer join eb on ea1=eb1
left outer join gb on eb1=gb31 and eb3 = gb33
left join ga on ga1=gb1 --RESULT:E1 3 G1 4 E1 3
E1 2 G1 2 E1 2
E1 1 G1 1 E1 1
E1 3 G2 4 E1 3
E1 5
E1 4
加入这个条件后,结果就不对了,看是否有办法解决
FROM dual
UNION ALL
SELECT 'G1', '2', 'E1', '2'
FROM dual
UNION ALL
SELECT 'G2', '3', 'E2', '3'
FROM dual
UNION ALL
SELECT 'G1', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '4', 'E1', '3'
FROM dual
UNION ALL
SELECT 'G2', '6', 'E2', '6'
FROM dual
UNION ALL
SELECT 'G3', '7', 'E2', '7'
FROM dual
UNION ALL
SELECT 'G4', '8', 'E2', '8' FROM dual) ,
ga as (SELECT 'G1' ga1,'Y' gaconf
FROM dual
UNION ALL
SELECT 'G2','N'
FROM dual
UNION ALL
SELECT 'G3','N' FROM dual),
eb as (SELECT 'E1' eb1, '1' eb3
FROM dual
UNION ALL
SELECT 'E1', '2'
FROM dual
UNION ALL
SELECT 'E1', '3'
FROM dual
UNION ALL
SELECT 'E1', '4'
FROM dual
UNION ALL
SELECT 'E1', '5' FROM dual),
ea as (SELECT 'E1' ea1 FROM dual)
select ea.ea1,eb.eb3,gb.*
from
ea left outer join eb on ea1=eb1
left outer join gb on eb1=gb31 and eb3 = gb33
left join (select * from ga where gaconf='Y') on ga1=gb1
order by 1,2
from eb, gb, ea, ga
where eb.eb1 = gb.gb31(+)
and eb.eb3 = gb.gb33(+)
and eb.eb1 = ea.ea1
and gb.gb1 = ga.ga1(+)
and ga.gaconf(+)='y'
order by 1, 2