子查询得到的表中有同名字段的解决方案

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='经理'

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值