先屡一下关系 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条记录 所有 就找到问题了.