Oracle requête EXISTE ne fonctionne pas comme prévu - bug DB Link?
-
24-10-2019 - |
Question
Je suis complètement déconcerté par les résultats de cette requête:
select count(*) from my_tab mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users@colink.world cu,
personnel_records@colink.world pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and mt.stat = cu.stat
)
Renvoie: 1
Il y a 0 enregistrements company_users@colink.world avec stat = « 2473 », alors pourquoi est-il vrai pour le retour existe?
Si je change la requête comme si elle retourne 0:
select count(*) from my_tab mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users@colink.world cu,
personnel_records@colink.world pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and cu.stat = '2473'
)
UPDATE D'accord, cela est vraiment bizarre. Juste pour voir ce qui se passerait, j'exécuté la requête de l'autre base de données (celle référencée par la DB Liens) et lui a donné des résultats différents (correct).
select count(*) from my_tab@mylink.world mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users cu,
personnel_records pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and mt.stat = cu.stat
)
Renvoie 0 (comme prévu).
La solution
Jetez un oeil à l'expliquer plan pour la première requête. Je soupçonne qu'il ya un bug, et le plan de requête peut montrer comment une réécriture non valide est fait.
Autres conseils
La deuxième requête dans votre question est un peu différent - il ne regarde pas cu.stat du tout, et donc le fait qu'il n'y a rien avec cu.stat = « 2473 » est pas abordée. Quels sont les résultats que vous obtenez si vous exécutez
select count(*)
from company_users@colink.world cu,
personnel_records@colink.world pr,
my_tab mt
where mt.stat = '2473' and
mt.name = 'Tom' and
pr.name = mt.name and
cu.user_id = pr.user_id and
cu.stat = mt.stat
Je pense que cela équivaut à votre première requête sans l'utilisation de EXISTE, et devrait fournir des résultats corrects.
Partager et apprécier.