通过DBLINK查询出现的问题

阅读更多
select t1.rolename
    from (select * from og.role@dblink) t1,
         (select * from og.userinfo@dblink) t2
   where t1.rolename = t2.username(+)
     and t2.username is null;

 

select t1.rolename
    from og.role@dblink t1,
         og.userinfo@dblink t2
   where t1.rolename = t2.username(+)
     and t2.username is null;

 大家看看这两个SQL有没有问题? 结果是否应该一样?

 实际这两个SQL出来的结果是不一样的,但我不明白其中的道理,有哪位朋友明白,请给解释下:)

第一个SQL还有一个诡异的现象,如果我在查询列表中加上一列t2.username时,结果也是正确的。

 

我又通过left join方式进行测试,没有发现问题。 所以可以断定是外连接+DBLINK双重原因引起的问题,但是原理不明白。 (后来经朋友指点查看了各种查询方式的执行计划,发现确实第一种写法是有问题的,可能算是dblink的一个BUG)

 select t1.rolename
   from (select * from og.role@dblink) t1
   left join (select * from og.userinfo@dblink) t2 on t1.rolename =
                                                           t2.username(+)
  where t2.username is null;

 

select t1.rolename
   from og.role@dblink t1
   left join og.userinfo@dblink t2 on t1.rolename = t2.username(+)
  where t2.username is null;
  • 执行计划.rar (1.4 KB)
  • 下载次数: 3

你可能感兴趣的:(SQL)