Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多行上的内部联接就像行不存在一样_Sql_Oracle_Inner Join - Fatal编程技术网

Sql 多行上的内部联接就像行不存在一样

Sql 多行上的内部联接就像行不存在一样,sql,oracle,inner-join,Sql,Oracle,Inner Join,我需要提取每个省注册学生的统计数据。学生有带邮政编码的地址;邮政编码链接到一个行政区;行政区与一个省相连。使用内部联接构建select非常简单 然而,从学生地址到邮政编码=1911,我有一个问题,因为有多个不同名称的邮政编码记录;请参见下面的数据摘录 1911 FLORA GARDENS,Vanderbijlpark 7702 VANDERBIJLPARK 1911 HENBYL 7702 VANDERBIJLPAR

我需要提取每个省注册学生的统计数据。学生有带邮政编码的地址;邮政编码链接到一个行政区;行政区与一个省相连。使用内部联接构建select非常简单

然而,从学生地址到邮政编码=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
不返回任何行

当我将此更改为左连接时

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 
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

如果没有内部联接结果,这意味着来自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'

我只是创建了一个子选择,唯一地选择邮政编码和行政区,如下所示:

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 
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

将ibvpos和ibdmag条件从WHERE子句移动到ON子句,以获得真正的左连接结果。在WHERE中,您将获得常规的内部联接结果…提示:当涉及多个表时,请限定所有列!例如,写tablename.columnname.Hi@jarlh,感谢您的回复。我不理解您从WHERE子句中移动ibvpos和ibdmag条件的评论,因为WHERE子句中没有对这些表的引用。你能澄清一下吗?我是在SQL中长大的,没有对列进行限定,因为我正在使用的Db的结构,但这是一个很好的做法。您必须决定要使用哪个名称,并将其连接到派生表/CTE,例如join select ibvcode,maxibvtown from stud.ibvpos group by ibvcode as ibvpos ON getpcode=ibvcoded谢,@dnoeth,我创建了一个不带郊区名称的独特子查询;我对名称不太感兴趣,我只需要将表加入到省表中。