SELECT E.NAME , D.NAME , C.NAME
FROM CAT C , DPT D , EMP E,DUAL X
WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+))
AND E.EMP_NO(+) = 1234
AND D.DEPT_NO(+) = 10
AND C.CAT_TYPE(+) = ‘RD’;上面的sql中,NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))这句是什么意思?
还有就是为什么在E.ROWID后加上(+),这又是什么意思?
请各位高手帮帮忙,解释一下,先谢谢啦!

解决方案 »

  1.   

    S := NVL(A,B) --如果A为空orNULL,则S为B,否则S为A(+)表示左连接
      

  2.   


    /*
    nvl(arg1,arg2):如果arg1为空,那么返回arg2的值,否则返回arg1
    nvl2(x,arg1,arg2):如果x为空,返回arg1的值,否则返回arg2的值
    */
      

  3.   

    NVL(‘X’,X.DUMMY) ----如果X为空,返回DUMMY 还有就是为什么在E.ROWID后加上(+),-----------左连接,与left join 一样的功能
      

  4.   

    先谢谢各位,这个nvl函数和(+)概念我知道,我想问的是为什么要这么连接?
    这段sql是在某资料上看到的,是关于sql优化的问题,原文的意思是如果有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),然后就给出如下例子:
    SELECT NAME
    FROM EMP
    WHERE EMP_NO = 1234;
    SELECT NAME
    FROM DPT
    WHERE DPT_NO = 10 ;
    SELECT NAME
    FROM CAT
    WHERE CAT_TYPE = ‘RD’;
    把上诉三段select语句合并成提问中的sql,资料中说这样的sql比分开三段查询高效。再请教各位一个问题,为什么合并成一个sql查询会高效呢?
      

  5.   

    因为select查询的过程要经过语法检查、生成执行计划等一系列的步骤合并查询只需要进行一次这样的过程,而分开则要进行三次
      

  6.   

    本身这三张表没有联系 借助oracle系统表dual进行关联查询建议看下dual的一些资料,这个系统表很有用的