加入两张桌子后如何获取错过的记录

时间:2015-06-10 14:42:50

标签: sql oracle oracle11g

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个其他表连接以获取所需数据。

1 个答案:

答案 0 :(得分:1)

听起来你想要一个全外连接

select whatever
from A a
  full outer join B b 
    on (a.emailid = b.emailid)
      or (a.registrationid = b.registrationid)

将返回空值,其中A中没有匹配的行,并且当B中没有匹配的行时。