db2数据库_SQLCODE=-203, SQLSTATE=42702, DRIVER=4.22.29_原因分析及解决方案

 问题如下:


当多个表关联查询的时,两个表都有相同字段时,如果要获取该字段,必须表明该字段来自哪张表,否则报错,列模糊。

如Student表(学生表)和Teacher表(老师表),表中都有id这个字段,为主键,自增。当两个表关联获取一个老师下的学生(学生表中t_id为老师表中的id)时候。查询代码如下
 

SELECT ID
FROM STUDENT a INNER JOIN TEACHER b
ON a.t_id = b.id

因为学生表和老师表中都有id字段。然而sql文中并没有标注查询的ID来自哪个表,所以报错

 

解决方案:

标注来源表即可

SELECT b.ID,b.name,a.id,a.name
FROM STUDENT a INNER JOIN TEACHER b
ON a.t_id = b.id

补充:

一般两个表关联这种问题不会犯,当多个表和某个表中还有子查询的时候,往往会犯这种较为低级的错误。

SELECT b.*,a.id,a.name
FROM STUDENT a INNER JOIN TEACHER b
ON a.t_id = b.id

 上面的sql文没有错误,查询出教师和学生的id,如果在该sql文上再次嵌套一层的话,那么很容易犯错

 我们假设在上面sql文的基础上再和学校资源表进行(sch_scourse )关联,获取该学校中老师所拥有的学校资源有哪些,(其实这里不需要教师表和学生表关联,多此一举,为了复现错误,理解一下。)

select a.id,a.name,b.name
from (
SELECT b.*,a.id,a.name
FROM STUDENT a INNER JOIN TEACHER b
ON a.t_id = b.id
) a INNER JOIN sch_scourse b
on a.id = b.own_id

 当我们再次执行上面的sql文时,就会报错SQLCODE=-203,还是同样的错误,乍一看没有问题,最外层只有别名为a,b的表,没有问题,再执行子查询中的sql文(第一个from中的查询,可以正常返回结果,没有问题,那么问题出在哪里呢)

原因在这里:子查询中教师表有id字段(虽然查询的是b.*,学生表有id字段),当最外层查询使用a.id进行查询的时候,数据库不知道你是想查询b.*还是a.*了,所以报错

解决:在子查询中对其中一个id 赋一个别名即可

解决后sql如下:

select a.id,a.name,b.name
from (
SELECT b.*,a.id as student_id,a.name
FROM STUDENT a INNER JOIN TEACHER b
ON a.t_id = b.id
) a INNER JOIN sch_scourse b
on a.id = b.own_id

问题解决。

你可能感兴趣的:(数据库,db2,错误整理)