在SQL查询中同时使用USING和ON时employee_id字段出现歧义问题求助
解决SQL中USING与ON同时使用导致的employee_id歧义问题
这个问题我之前也碰到过,其实就是多表连接时字段归属不明确搞的鬼!咱们来拆解下你的问题:
你的SQL语句里,先通过ON关联了员工表employees的两个实例(员工e和经理m),这时候结果集里同时存在e.employee_id和m.employee_id两个同名不同源的字段。紧接着你用USING(employee_id)关联job_history表,数据库这时候就犯难了——它不知道你要拿哪个employee_id去关联job_history,自然就抛出歧义错误了。
解决办法其实很简单,给你两种方案选:
方案1:把USING换成ON,明确指定关联的字段归属
这是最稳妥的方式,直接告诉数据库你要关联哪个表的employee_id。比如如果你想查询有A开头职位历史的经理信息,就关联经理表的employee_id:
SELECT m.employee_id, m.first_name, m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id JOIN job_history jh ON m.employee_id = jh.employee_id WHERE jh.job_id LIKE 'A%';
要是你想查的是身为经理且有A开头职位历史的员工,就改成关联员工表的employee_id:
SELECT m.employee_id, m.first_name, m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id JOIN job_history jh ON e.employee_id = jh.employee_id WHERE jh.job_id LIKE 'A%';
方案2:如果非要用USING,先确保结果集里只有一个employee_id字段
你可以在前面的JOIN中只保留你需要的employee_id,比如通过字段筛选去掉另一个:
SELECT m.employee_id, m.first_name, m.last_name FROM ( SELECT m.employee_id, m.first_name, m.last_name, e.manager_id FROM employees e JOIN employees m ON e.manager_id = m.employee_id ) AS manager_data JOIN job_history USING (employee_id) WHERE job_id LIKE 'A%';
不过这种方式多了一层子查询,可读性不如方案1,一般更推荐用方案1。
总结下:USING适合那种两个表只有一个同名字段的简单关联场景,多表嵌套关联时,用ON明确字段归属能避免绝大多数歧义问题。
内容的提问来源于stack exchange,提问作者mrk kpp
相关产品推荐
相关产品推荐

