Oracle existe la consulta no funciona como se esperaba: ¿DB Link Bug?
-
24-10-2019 - |
Pregunta
Estoy completamente desconcertado por los resultados de esta consulta:
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
)
Devoluciones: 1
Hay 0 registros en compañía_users@colink.world con stat = '2473', entonces, ¿por qué devuelve verdadero para los existe?
Si cambio la consulta así, devuelve 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'
)
ACTUALIZAR De acuerdo, esto es realmente extraño. Solo para ver lo que sucedería, ejecuté la consulta desde la otra base de datos (la que hace referencia por los enlaces de DB) y dio resultados (correctos) diferentes.
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
)
Devuelve 0 (como se esperaba).
Solución
Eche un vistazo al plan de explicación para la primera consulta. Sospecho que hay un error, y el plan de consulta puede mostrar cómo se está haciendo una reescritura inválida.
Otros consejos
La segunda consulta en su pregunta es un poco diferente: no se ve en CU.Stat en absoluto y, por lo tanto, no se aborda el hecho de que no hay nada con Cu.Stat = '2473'. ¿Qué resultados obtienes si ejecuta?
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
Creo que esto es equivalente a su primera consulta sin el uso de Existes, y debería proporcionar resultados correctos.
Comparte y Disfruta.