TABLE AA
ID NAME EMAIL TRAID STUSYID
-----------------------------------------
1 Ketan ketan@test.com 1
2 Pankaj pankaj@test.com PL1 5
3 Adil adil@test.com AS1 1
4 Lalit lalit@test.com 7
5 Adil adil@test.com AS1 2
6 Adil adil@test.com AS1 3
TABLE AB
ID NAME EMAIL TRAID STUSYID
-----------------------------------------
1 Pankaj pankaj@test.com PL1 5
2 Lalit lalit@test.com 7
3 Milind milind@test.com 8
4 Akhi akhi@test.com 8
5 Milind milind@test.com 8
6 Pa pankaj@test.com PL1 8
7 Adil1 adil@test.com AS1 1
8 Adil2 adil@test.com AS1 2
我想从表a中获取所有细节,如下所示:
((select * from AA a JOIN AB b ON A.EMAIL = B.EMAIL AND A.TRAID IS NULL)
union
(select * from AA a JOIN AB b ON A.TRAID = B.TARID AND A.TRAID IS NOT NULL)
获得上述结果后,我想得到表AB中所有剩余的结果,这些结果在上面的结果集中是不可用的,我想合并/联合整个结果集(我想通过一个SQL语句来获取整个结果)。 )
我正在使用oracle 11 g DB。
编辑添加结果:
根据理查德的建议,我更新了如下查询:
select * from AA a FULL OUTER JOIN AB b
ON (A.EMAIL = B.EMAIL AND A.STUSYID = B.STUDYID)
OR (A.TRAID = B.TARID AND A.STUSYID = B.STUDYID)
我得到的结果如下:
ID NAME EMAIL TRAID STUSYID ID_1 NAME_1 EMAIL_1 TRAID_1 STUSYID_1
---------------------------------------------------------------------------
1 Ketan ketan@test.com 1
2 Pankaj pankaj@test.com PL1 5 1 Pankaj pankaj@test.com PL1 5
3 Adil adil@test.com AS1 1 7 Adil1 adil@test.com AS1 1
4 Lalit lalit@test.com 7 2 Lalit lalit@test.com 7
5 Adil adil@test.com AS1 2 8 Adil2 adil@test.com AS1 2
6 Adil adil@test.com AS1 3
3 Milind milind@test.com 8
4 Akhi akhi@test.com 8
5 Milind milind@test.com 8
6 Pa pankaj@test.com PL1 8
这就是我想要的结果(基于TARID或EMAIL的两个表中的所有匹配行(如果TARID为null))。 但是如果我做'FULL OUTER JOIN',我的查询性能会非常低。查询成本为34000.请建议以任何方式获得具有良好查询性能的上述结果。
注意:实际实时查询将有7-8个其他表连接以获取所需数据。
答案 0 :(得分:1)
听起来你想要一个全外连接:
select whatever
from A a
full outer join B b
on (a.emailid = b.emailid)
or (a.registrationid = b.registrationid)
将返回空值,其中A中没有匹配的行,并且当B中没有匹配的行时。