Oracle ESISTE query non funziona come previsto - DB link bug?
-
24-10-2019 - |
Domanda
Sono completamente sconcertato dai risultati di questa query:
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
)
Returns: 1
Ci sono 0 record in company_users@colink.world con stat = '2473', quindi perché è tornando vero per il esiste?
Se cambio la query in questo modo, restituisce 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'
)
Aggiorna Okay, questo è davvero strano. Solo per vedere cosa sarebbe successo, ho eseguito la query dall'altro database (quello a cui fa riferimento il DB Collegamenti) e ha dato diversi (corrette) risultati.
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
)
restituisce 0 (come previsto).
Soluzione
Dai un'occhiata al piano di spiegare per la prima query. Ho il sospetto che ci sia un bug, e il piano di query può mostrare come un valido riscrittura è stato fatto.
Altri suggerimenti
La seconda query nella tua domanda è un po 'diverso - non guarda cu.stat a tutti, e quindi il fatto che non c'è nulla con cu.stat = '2473' non è indirizzato. Quali risultati si ottiene se si esegue
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
Credo che questo è equivalente alla tua prima domanda senza l'uso di esiste, e dovrebbe fornire risultati corretti.
Condividere e godere.