Sql 多行上的内部联接就像行不存在一样
我需要提取每个省注册学生的统计数据。学生有带邮政编码的地址;邮政编码链接到一个行政区;行政区与一个省相连。使用内部联接构建select非常简单 然而,从学生地址到邮政编码=1911,我有一个问题,因为有多个不同名称的邮政编码记录;请参见下面的数据摘录Sql 多行上的内部联接就像行不存在一样,sql,oracle,inner-join,Sql,Oracle,Inner Join,我需要提取每个省注册学生的统计数据。学生有带邮政编码的地址;邮政编码链接到一个行政区;行政区与一个省相连。使用内部联接构建select非常简单 然而,从学生地址到邮政编码=1911,我有一个问题,因为有多个不同名称的邮政编码记录;请参见下面的数据摘录 1911 FLORA GARDENS,Vanderbijlpark 7702 VANDERBIJLPARK 1911 HENBYL 7702 VANDERBIJLPAR
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,我创建了一个不带郊区名称的独特子查询;我对名称不太感兴趣,我只需要将表加入到省表中。