SQL的Ambiguous错误
翻阅笔记发现我在去年的时候记录了一个问题,关于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
错误的主要场景。查询的字段ID
在T_USER
和T_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 by
、group 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
这个关键字,那么基本上就是重复列或者歧义列的原因了。避免的办法也很简单,表关联多的时候尽量给每个表都加上唯一的别名。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment