记一次sql多表查询的错误

先屡一下关系  bi==block_ihc ,p==patholgy  sp==special_pathology 

SELECT
	  sp.id,
		p.id AS  pathId,
		bi.id as bid,
		ai.id as aid,
		sp.number,
		bi.ihc_id AS IhcId,
		bi.sub_id AS subId,
		bi.ihc_marker AS marker,
		bi.ORDER	
FROM
		block_ihc bi
INNER JOIN pathology p ON bi.path_id = p.id INNER JOIN application_ihc ai on bi.ihc_id=ai.id
INNER JOIN special_application sp on sp.path_no=p.serial_number
WHERE	bi.number in( 'I20180036');

这个语句查询的结果 是


这个结果是错误的 同样一条记录出现了两次 

正确的sql 语句应该是这样的:

SELECT
  bi.id,
	bi.ihc_id AS IhcId,
	p.serial_number AS pathNo,
	bi.sub_id AS subId,
	bi.ihc_marker AS marker,
	bi.ORDER,
	ai.note,
	p.id AS pathId
FROM
	block_ihc bi
INNER JOIN pathology p ON bi.path_id = p.id
INNER JOIN application_ihc ai ON bi.ihc_id = ai.id
INNER JOIN special_application sp ON bi.number = sp.number
WHERE
	sp.number ='I20180036';

结果是这样的:


我不明白的上面错误的 sql为什么 会多出两条相同的记录?

我后来仔细看了下 原因是这样的

FROM
		block_ihc bi
INNER JOIN pathology p ON bi.path_id = p.id INNER JOIN application_ihc ai on bi.ihc_id=ai.id

这个的关系主体都是 bi表 on 都是 与bi表产生的关系且 都是id 关系所以结果 结果集都是以bi为主体 ,

错误的sql中这个就出第二个 结果集

INNER JOIN special_application sp ON sp.path_no=p.serial_number

上述的 第二个结果集已经和 bi表脱离了关系,special_application和pathology 是多对一的关系所以导致这里会有两个结果集

由于 在条件 bi.number="I20180036" 次数的 p表就会产生一条记录  这里就造成第二个结果集的 p是唯一的 但是 这个p下有两个sp记录 所以第二个结果集是有两条记录 

同样道理 第一个结果集有两条记录  两个结果集进行叉乘  产生的 笛卡尔积 肯定就是 4条记录 所有 就找到问题了.

猜你喜欢

转载自blog.csdn.net/weixin_41301898/article/details/79411551
今日推荐