多行上的INNER JOIN就像行不存在一样

时间:2018-09-27 08:50:36

标签: sql oracle inner-join

我需要提取每个省注册学生的统计信息。学生的住所带有邮政编码。邮政编码链接到县辖区;县辖区与一个省相连。使用内部联接建立选择是相当简单的选择。

但是,从学生地址到邮政编码(代码= 1911),我遇到了一个问题,因为该邮政编码有多个记录,且记录的郊区名称不同。请参阅下面的数据摘录。

1911    FLORA GARDENS,Vanderbijlpark    7702    VANDERBIJLPARK
1911    HENBYL                          7702    VANDERBIJLPARK
1911    LUMIER                          7702    VANDERBIJLPARK
1911    NORTHDENE,Vanderbijlpark        7702    VANDERBIJLPARK
1911    PARK SOUTH                      7702    VANDERBIJLPARK
1911    STAAL                           7702    VANDERBIJLPARK
1911    VANDERBIJLPARK                  7702    VANDERBIJLPARK
1911    ZUURFONTEIN                     7702    VANDERBIJLPARK

当我执行“内部联接”选择时,

FROM gen.getadr
INNER JOIN stud.iadbio ON getunum = iadstno
INNER JOIN stud.ibvpos ON getpcode = ibvcode
INNER JOIN stud.ibdmag ON ibvcode = ibdcode

不返回任何行。

当我将其更改为LEFT联接

FROM gen.getadr
INNER JOIN stud.iadbio ON getunum = iadstno
LEFT JOIN stud.ibvpos ON getpcode = ibvcode
LEFT JOIN stud.ibdmag ON ibvcode = ibdcode

我从ibvpos和idbmag获得的行没有。因此,我无法加入省份表来计算每个省份的学生。

有没有一种方法可以表明getadr(学生地址)和ibvpos(邮政编码的定义-多行)之间的联接必须基于getpcode和ibvcode之间的唯一匹配?

完整的select语句如下:

SELECT getunum, getnumtype, getaddrtype, GETCSn, getsdate, getedate, gettac,    
getsyscrt 
, getadr1, getadr2, getadr3, getadr4, getpcode, ibvtown, ibdname
FROM gen.getadr
 INNER JOIN stud.iadbio ON getunum = iadstno
 LEFT JOIN stud.ibvpos ON getpcode = ibvcode
 LEFT JOIN stud.ibdmag ON ibvcode = ibdcode
where getnumtype = 'I' and getsyscrt = 'S' 
 AND iadstno = 217244521
 AND getaddrtype = 'PA'
 AND getedate IS NULL
 AND getprimary = 'Y'
ORDER BY getsyscrt, getnumtype, getcsn 

任何帮助将不胜感激。

此致

Phlip

2 个答案:

答案 0 :(得分:0)

如果没有内部联接结果,则表示getadr表中的数据与其他表中的数据不匹配(如果这些表中没有数据或数据格式不同)。您对此查询有任何结果吗? getpcode是否不为null,并且存在于stud.ibvpos表中?

  SELECT getunum, getpcode 
  FROM gen.getadr
  INNER JOIN stud.iadbio ON getunum = iadstno
  LEFT JOIN stud.ibvpos ON getpcode = ibvcode
  LEFT JOIN stud.ibdmag ON ibvcode = ibdcode
  WHERE ibvcode is not null
  AND getnumtype = 'I'
  AND getsyscrt = 'S'
  AND getaddrtype = 'PA'
  AND getedate IS NULL
  AND getprimary = 'Y'

答案 1 :(得分:0)

我仅创建了一个子选择,可以唯一选择邮政编码和地方行政区,例如:

FROM gen.getadr
  INNER JOIN stud.iadbio ON getunum = iadstno
  INNER JOIN 
    (SELECT DISTINCT ibvpcode, ibvcode 
     FROM stud.ibvpos
    ) ON getpcode = ibvpcode
  INNER JOIN stud.ibdmag ON ibvcode = ibdcode
  INNER JOIN stud.innprv ON ibdprovc = innprovc

这给了我预期的结果。

此致

Phlip