CREATE TABLE job( -- 职务表
id INT PRIMARY KEY AUTO_INCREMENT,
jname VARCHAR(20), -- 职务名
description VARCHAR(50) -- 职务描述
);
INSERT INTO job ( jname ,description)
VALUES('董事长', '管理整个公司,接单'),
('经理', '管理部门员工'),
('销售员', '向客人推销产品'),
('文员', '使用办公软件');
CREATE TABLE emp( -- 员工表
id INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50), -- 名字
job_id INT, -- 职务id 外键
mgr INT , -- 上级领导
join_date DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
CONSTRAINT emp2_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job(id)
);
INSERT INTO emp(id,ename,job_id,mgr,join_date,salary,bonus) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00'),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00'),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00'),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00'),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL);
有以上一对多的两张表 , 我们进行如下查询:
-- 查询经理的全部信息,一些显示字段我没列出来,因为无关本文)
SELECT * FROM ( SELECT e.id, j.id , j.jname FROM emp e JOIN job j ON e.job_id=j.id ) AS h WHERE h.jname='经理'
结果会报错, 如下:
错误代码: 1060
Duplicate column name 'id'
分析原因: 子查询得到的表中有两个字段同名,这个例子里就是job表中id ,和emp表中的id
子查询结果表作为主查询的表,主查询无法识别两个id,于是报错,说表中有重复的字段名 id
解决方案: 在子查询的显示结果集中,给其中一个id取别名, 这样主查询就能分辨了
SELECT * FROM ( SELECT e.id AS eid , j.id , j.jname FROM emp e JOIN job j ON e.job_id=j.id ) AS h WHERE h.jname='经理'