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).

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top