游标SELECT列表需加别名避免函数列名重复,排查编译报错原因
嘿,这个问题我之前踩过坑!虽然你给表加了别名,但游标报「游标SELECT列表中需使用别名以避免函数内出现重复列名」的错误,大概率不是表别名没生效,而是这几个细节没注意到:
查询结果存在同名列(哪怕来自不同表)
表别名只是用来区分不同表的字段,但如果你的SELECT语句直接写了a.id, b.id,哪怕表有别名,最终返回的结果列都会叫id,游标根本没法区分这两个列。这时候必须给每个重复的字段单独加别名,比如写成a.id AS user_id, b.id AS order_id,而不是只给表起别名就完事。误用了
SELECT *查询
如果你的游标查询里用了SELECT *,哪怕表有别名,不同表的同名字段(比如两个表都有name、create_time)还是会重复出现在结果里。比如SELECT * FROM users a JOIN orders b ON a.id = b.user_id,结果里会有两个id、两个name,直接触发报错。这种情况一定要明确列出需要的字段,并且给重复字段加别名。不小心给不同字段加了相同的别名
比如你手滑写了SELECT a.nickname AS uname, b.username AS uname,哪怕这两个字段来自不同表,结果列的别名重复了,游标也会报错。检查一下你的SELECT语句里的别名,确保每个列的别名都是唯一的。关联查询的隐式重复列
比如用JOIN ... USING(xxx)语法时,数据库会自动合并同名的关联字段,但如果是用ON a.xxx = b.xxx又同时选中了a.xxx和b.xxx,没加别名的话就会出现重复列。举个例子:
错误写法:DECLARE order_cur CURSOR FOR SELECT a.id, b.id, a.name, b.order_no FROM users a JOIN orders b ON a.id = b.user_id;正确写法:
DECLARE order_cur CURSOR FOR SELECT a.id AS user_id, b.id AS order_id, a.name AS user_name, b.order_no FROM users a JOIN orders b ON a.id = b.user_id;
最后给你个小技巧:把游标里的SELECT语句单独拿出来执行一下,看看返回的列名是不是有重复的,这样就能快速定位到问题所在啦!
内容的提问来源于stack exchange,提问作者maciejka

