INNER JOIN中子查询报错原因分析(MySQL Workbench)
错误原因分析
你遇到的Error Code: 1054. Unknown column 'N.id_system_user' in 'on clause'报错,本质是列引用无效,通常由两种常见情况导致:
1. 子查询没返回id_system_user列
如果你的子查询里没选中id_system_user字段,那这个子查询生成的临时表结果集里就没有这个列,自然没法在JOIN的ON子句里引用N.id_system_user。
错误示例:
CREATE VIEW fifa_players AS SELECT su.first_name, su.last_name, su.email FROM SYSTEM_USER su INNER JOIN ( -- 子查询只选了id_game,漏了id_system_user SELECT p.id_game FROM PLAY p INNER JOIN GAME g ON p.id_game = g.id_game WHERE g.name = 'FIFA 22' ) N ON su.id_system_user = N.id_system_user;
2. 子查询别名的定义顺序错了
MySQL解析JOIN语句时,会先处理ON子句,再确认子查询的别名。要是你把别名N写在ON子句之后,解析ON子句的时候,别名N还没被定义,就会提示找不到这个列。
错误示例:
CREATE VIEW fifa_players AS SELECT su.first_name, su.last_name, su.email FROM SYSTEM_USER su INNER JOIN ( SELECT p.id_system_user FROM PLAY p INNER JOIN GAME g ON p.id_game = g.id_game WHERE g.name = 'FIFA 22' ) ON su.id_system_user = N.id_system_user N; -- 别名N写在ON之后,解析时识别不了
正确的子查询JOIN写法
要避免报错,得满足两个条件:子查询返回需要关联的id_system_user列,且别名定义在子查询之后、ON子句之前:
CREATE VIEW fifa_players AS SELECT su.first_name, su.last_name, su.email FROM SYSTEM_USER su INNER JOIN ( -- 必须选中用于关联的id_system_user SELECT p.id_system_user FROM PLAY p INNER JOIN GAME g ON p.id_game = g.id_game WHERE g.name = 'FIFA 22' ) N -- 别名N要写在这儿,ON子句前面 ON su.id_system_user = N.id_system_user;
为什么另外两种写法能正常运行
你说另外两种写法没问题,大概率是以下两种情况:
- 直接多表JOIN:直接关联三张物理表,所有列都是真实存在的,不会出现临时表列缺失的问题
CREATE VIEW fifa_players AS SELECT su.first_name, su.last_name, su.email FROM SYSTEM_USER su INNER JOIN PLAY p ON su.id_system_user = p.id_system_user INNER JOIN GAME g ON p.id_game = g.id_game WHERE g.name = 'FIFA 22';
IN子查询过滤:子查询只用来生成用户ID的过滤列表,不需要在JOIN子句里引用临时表的列,自然不会触发1054错误
CREATE VIEW fifa_players AS SELECT first_name, last_name, email FROM SYSTEM_USER WHERE id_system_user IN ( SELECT p.id_system_user FROM PLAY p INNER JOIN GAME g ON p.id_game = g.id_game WHERE g.name = 'FIFA 22' );
内容的提问来源于stack exchange,提问作者KurtosisCobain
相关产品推荐
相关产品推荐

