翻阅笔记发现我在去年的时候记录了一个问题,关于SQL的Ambiguous的错误,笔记里的错误信息是Ambiguous column name,但是我按照笔记里的场景再次执行SQL的时候,发现报错信息已经不是这个了,而是换成了1052 - Column 'ID' in where clause is ambiguous。姑且不去思考是不是当时记录错了,反正错误的原因只有一个,那就是多个表关联的时候,可能某个字段在两个以及两个以上的表中都存在,但是在做条件或者查询字段的时候没有给其指定表而导致的错误,可以理解为有重复的列或者是歧义的列。

还原场景如下:
因SQL太长,我就简化一下吧

1
select ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID where ID=1001

这个SQL大约大约就是Ambiguous错误的主要场景。查询的字段IDT_USERT_DEPT中都存在,但是并没有指定是谁的ID,如果这个SQL中没有WHERE条件,那么也是可以执行的。

1
select ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID

如果给查询的字段加了表名,那么WHERE条件没有加表名,也会出现Ambiguous的错误。

1
select T_DEPT.ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID where ID=1001

除此之外,以下两种情况也会出现Ambiguous的错误(order bygroup by等等)。

1
select ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID order by ID

或者

1
select ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID order by T_DEPT.ID

但是下面这个SQL可以执行。

1
select T_DEPT.ID from T_USER INNER JOIN T_DEPT ON T_USER.ID=T_DEPT.ID order by ID

其实这种错误很简单,但是当SQL复杂到一定程度,表关联特别多的时候就很容易出现了,所以如果一旦SQL中的报错信息有Ambiguous这个关键字,那么基本上就是重复列或者歧义列的原因了。避免的办法也很简单,表关联多的时候尽量给每个表都加上唯一的别名。