关于表的连接问题
有两张表
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的记录是出不来的为什么不是左连接或全连接呢?
有两张表
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的记录是出不来的为什么不是左连接或全连接呢?
T_REF 是从表 一般只有设计的话
就表示 在主表里一个REF_ID 对应从表T_REF里多个REF_ID
他们是1:N的关系
如果接触过明细表就很容易理解了
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(+)
是对REF_TYPE那里不太明白,‘CONSTANTS’是一个常量,为什么要将这个作为左连接呢?
那这样出的数据的话不是所有TYPE 为‘CONSTANTS’的数据都出了,那MASTER只有一条数据呢?
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就明白了。
可是当MASTER_.REF_ID为空的时候数据时出不来的
AND MS.REF_TYPE = REF.REF_TYPE(+)
AND MS.REF_TYPE='CONSTANTS'
这样想象
写错了
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
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(+)