我正在做一个问题陈述,其中我需要保留基于三个表上应用的逻辑的记录。表如下所列。
表A:
|Id|phone_number|帐号名称
|-|-|
|123|80001|1001
表_B
|Id|phone_number|帐号名称
|-|-|
|124|80002|1002
表_C
|Id|phone_number|帐号名称
|-|-|
|125|80003|1003
我编写了一个查询,如下所示:
select /*+PARALLEL(su,8)*/ su.ID from TableA su where
(
EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ PHONE_NUMBER from TableB sa where PHONE_NUMBER=su.PHONE_NUMBER)
or EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ PHONE_NUMBER from TableC sa where PHONE_NUMBER=su.PHONE_NUMBER)
)
and
(
EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ ACCOUNT_NAME from TableB sa where ACCOUNT_NAME=su.ACCOUNT_NAME)
or EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ ACCOUNT_NAME from TableC sa where ACCOUNT_NAME=su.ACCOUNT_NAME)
)
and
NOT EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ ID from TableC sa where ID=su.ID)
and NOT EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ ID from TableB sa where ID=su.ID);
我这里的要求是,对于表A的记录,如果Phone_Number和Account_NAME在TableB或TableC中,并且ID不在这两个表中的任何一个表中,那么记录应该存在。现有代码在大多数情况下都可以工作,但有一个特定的场景是不起作用的,其中对于表A的特定记录,Account_NAME和Phone_Number存在于TableB或TableC中的两个不同的记录中。我想从我的输出中排除这类记录,因此我尝试将查询转换为三向联接,以便在特定记录上进行联接。我写的查询如下-
select su.id from TableA su,TableB sa,TableC sb where (su.PHONE_NUMBER=sa.PHONE_NUMBER OR su.PHONE_NUMBER=sb.PHONE_NUMBER) and (su.ACCOUNT_NAME=sa.ACCOUNT_NAME OR su.ACCOUNT_NAME=sb.ACCOUNT_NAME)
and NOT EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ id from TableC sa where id=su.id)
and NOT EXISTS (select /*+ PARALLEL(sa,8) PARALLEL(su,8)*/ id from TableB sa where id=su.id);
该查询返回许多重复项,我也尝试使用DISTINCT,但仍然得到不正确的结果。
有人能告诉我我的问题出了什么问题吗?敬请指教。
谢谢!
1条答案
按热度按时间vsdwdz231#
我还是不能肯定我是否明白你的要求。下面的查询查找TableA行,其中TableB或TableC中存在具有相同的ACCOUNT_NAME/PHONE_NUMBER对但ID不同的行。
如果你想看到其他的ID,你必须加入。我建议将TableB和TableC结合起来: