关于表的连接问题
有两张表
T_MASTER
ID
REF_ID
XX
XXT_REF
ID
NAME
REF_TYPE现在要查询MASTER表的数据
SELECT MS.ID, MS.REF_NAME,MS.XX,MS.XX FROM T_MASTER MS,T_REF REF
WHERE REF.ID(+)=MS.REF_ID
AND REF.REF_TYPE(+)='CONSTANTS'
这个地方不太明白为什么要用右连接,连接时保证一边的数据全部出,
现在是想出全MASTER表的数据,为什么要使用右连接
若使用全连接的话,当REF_ID为空的话,MASTER的记录是出不来的为什么不是左连接或全连接呢?

解决方案 »

  1.   

    T_MASTER是主表
    T_REF 是从表 一般只有设计的话
    就表示 在主表里一个REF_ID 对应从表T_REF里多个REF_ID
    他们是1:N的关系
    如果接触过明细表就很容易理解了
      

  2.   

    LZ没有理解表连接的概念换过来写会不会更清晰一点呢
    SELECT MS.ID, MS.REF_NAME, MS.XX, MS.XX
      FROM T_MASTER MS, T_REF REF
     WHERE MS.REF_ID = REF.ID(+) 
       AND 'CONSTANTS' = REF.REF_TYPE(+)
      

  3.   


    是对REF_TYPE那里不太明白,‘CONSTANTS’是一个常量,为什么要将这个作为左连接呢?
    那这样出的数据的话不是所有TYPE 为‘CONSTANTS’的数据都出了,那MASTER只有一条数据呢?
      

  4.   

    SELECT MS.ID, MS.REF_NAME, MS.XX, MS.XX
      FROM T_MASTER MS, T_REF REF
     WHERE MS.REF_ID = REF.ID(+) 
       AND 'CONSTANTS' = REF.REF_TYPE(+)
    如果不加AND 'CONSTANTS' = REF.REF_TYPE(+),Oracle会默认全连接了。
    你把'CONSTANTS'想象成T_MASTER的另外一个Column就明白了。
      

  5.   

    刚才没发现SQL里只查询了T_MASTER表的列,这样左、右连接的意义就不大了,应该全连接也能满足需求,只把REF.REF_TYPE='CONSTANTS' 这个条件加上就好
      

  6.   


    可是当MASTER_.REF_ID为空的时候数据时出不来的
      

  7.   

    SELECT MS.ID, MS.REF_NAME, MS.XX, MS.XXFROM T_MASTER MS, T_REF REFWHERE MS.REF_ID= REF.ID(+)AND'CONSTANTS'= REF.REF_TYPE(+)
    AND MS.REF_TYPE = REF.REF_TYPE(+)
    AND MS.REF_TYPE='CONSTANTS'

    这样想象
      

  8.   


    写错了
    SELECT MS.ID, REF.REF_NAME,MS.XX,MS.XX FROM T_MASTER MS,T_REF REF
    WHERE REF.ID(+)=MS.REF_ID
    AND REF.REF_TYPE(+)='CONSTANTS'是REF.REF_NAME不是MS.REF_NAME
      

  9.   

    实际上这段SQL可写成:
    SELECT MS.ID, REF.REF_NAME, MS.XX, MS.XX
      FROM T_MASTER MS, (SELECT ID, REF_NAME
                           FROM T_REF
                          WHERE REF_TYPE = 'CONSTANTS') REF
     WHERE MS.REF_ID = REF.ID(+)也可以这样想象:
    SELECT MS.ID, MS.REF_NAME, MS.XX, MS.XX
      FROM T_MASTER MS, T_REF REF
     WHERE MS.REF_ID = REF.ID(+) 
       AND MS.REF_TYPE(这里换成了实际值'CONSTANTS',T_MASTER表的值还是要全部显示) = REF.REF_TYPE(+)