前因:在优化sql的时候,在from里面嵌套子查询缩小结果集。
先写一下下面建表、连表查询的大概关系。
CREATE TABLE `table_a` (
`FID` VARCHAR(32) NOT NULL COMMENT 'ID' COLLATE 'utf8_general_ci',
`Fname` VARCHAR(8) NULL DEFAULT NULL COMMENT '名称' COLLATE 'utf8_general_ci',
`Fphone` VARCHAR(20) NULL DEFAULT NULL COMMENT '电话' COLLATE 'utf8_general_ci',
PRIMARY KEY (`FID`) USING BTREE,
)
COMMENT='a'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table_b` (
`FID` VARCHAR(32) NOT NULL COMMENT 'ID' COLLATE 'utf8_general_ci',
`Fproject` VARCHAR(8) NULL DEFAULT NULL COMMENT '名称' COLLATE 'utf8_general_ci',
`FName` VARCHAR(20) NULL DEFAULT NULL COMMENT '电话' COLLATE 'utf8_general_ci',
`Fseq` VARCHAR(20) NULL DEFAULT NULL COMMENT '电话' COLLATE 'utf8_general_ci',
PRIMARY KEY (`FID`) USING BTREE,
)
COMMENT='b'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table_b` (
`FID` VARCHAR(32) NOT NULL COMMENT 'ID' COLLATE 'utf8_general_ci',
`Fname` VARCHAR(8) NULL DEFAULT NULL COMMENT '名称' COLLATE 'utf8_general_ci',
`Ftable` VARCHAR(20) NULL DEFAULT NULL COMMENT '电话' COLLATE 'utf8_general_ci',
PRIMARY KEY (`FID`) USING BTREE,
)
COMMENT='b'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
select a.Fid,a.Fname,a.Fphone,b.Fname,b.Fproject,b.Fseq,c.Ftable,c.Fname
from table_a a
left join table_ b b on a.Fid = b.Fid
left join table_c c on a.Fid = c.Fid
where 1=1
再写一个出问题的SQL
select a.Fid,a.Fname,a.Fphone,b.Fname,b.Fproject,b.Fseq,c.Ftable,c.Fname
from (
select * from table_a a
left join table_b b on a.Fid = b.Fid
where b.Fproject = 'xxx'
) a
left join table_ b b on a.Fid = b.Fid
left join table_c c on a.Fid = c.Fid
where 1=1
这里运行的时候就会出现报这个错:
Duplicate column name ‘FId’
这是为什么呢?
其实原因很简单,因为在子查询里面select *了,这里不但会返回table_a的字段,也会返回table_b的字段,这两个字段重复了,知道问题就好修改了,考虑到业务上返回其实只需要table_a的字段,所以将上面子查询select *from 修改成 select a.*from就可以了。
同时说一下添加子查询的优化思路:
在from里面嵌套子查询缩小结果集,在多张大表联表查询的时候这样优化sql,性能可以提升很多的。