更新美国客户邮箱时,带WHERE子查询的SQL UPDATE报1054错误求助
解决Error Code: 1054 - Unknown column 'country' in 'IN/ALL/ANY subquery'的问题
这个报错的根源很明确:你外层UPDATE语句里的WHERE country IN (...)是在找Customer表的country字段,但Customer表本身根本没有这个列——国家信息存在country表中,需要通过表关联才能拿到。
给你两种可行的修正方案:
方案一:用JOIN直接关联更新(推荐)
这种方式更高效,直接把Customer和关联表连起来,定位到美国的客户再执行更新:
Update Customer JOIN address USING(address_id) JOIN city USING(city_id) JOIN country USING(country_id) Set email = concat(substr(first_name,1,1), last_name,'@sakilacustomer.com.us') WHERE country.country = 'United States';
方案二:子查询返回customer_id匹配
如果偏爱子查询的写法,你需要让子查询返回Customer表存在的字段(比如customer_id),再用这个字段进行匹配:
Update Customer Set email = concat(substr(first_name,1,1), last_name,'@sakilacustomer.com.us') where customer_id in( Select c.customer_id From customer c join address using(address_id) join city using(city_id) join country using(country_id) Where country = 'United States' );
为什么原来的写法会报错?
你原来的子查询返回的是country字段的值(也就是字符串'United States'),但外层WHERE country IN (...)里的country,数据库会默认解析为Customer表的列——而Customer表没有这个列,所以就抛出了1054错误。
另外提一句,原来子查询里的GROUP BY country和HAVING country = 'United States'完全没必要,直接用WHERE country = 'United States'过滤就行,分组只会增加不必要的性能开销。
内容的提问来源于stack exchange,提问作者Brendan Gilman
相关产品推荐
相关产品推荐

