DISTINCT 从结果集中删除记录
我有三张桌子
TBL1 TBL2 TBL3
---- ------ --------
tbl1_id tbl2_id tbl3_id
cid fkcid fkcid
fktbl1_id fktbl2_id
我有查询来获取TBL3的记录
select distinct tbl3.* from TBL3 tbl3
inner join TBL2 tbl2 on tbl2.tbl2_id = tbl3.fktbl2_id and tbl2.fkcid = tbl3.fkcid
inner join TBL1 tbl1 on tbl1.tbl1_id = tbl2.fktbl1_id and tbl2.fkcid = tbl1.cid;
这个查询给了我大约1000条记录。
但当我从查询中删除时,它会给我大约1100条记录。 表中没有重复的记录。我也确认这些额外的100不重复。请注意,在使用不同关键字的查询中找不到这些额外的100条记录。
为什么这个查询会出现意外行为。如果我犯了错误,请帮助我更清楚地理解并纠正我。 谢谢
答案 0 :(得分:1)
您在tbl1或tbl2中有多个映射到同一tbl3的记录,并且由于您只在输出中选择了tbl3。*,因此DISTINCT会删除重复项。要找到重复项,请删除DISTINCT,向SELECT子句添加COUNT(*),最后添加GROUP BY和HAVING,例如:
select tbl3.*, count(*)
from TBL3 tbl3
inner join TBL2 tbl2 on tbl2.tbl2_id = tbl3.fktbl2_id and tbl2.fkcid = tbl3.fkcid
inner join TBL1 tbl1 on tbl1.tbl1_id = tbl2.fktbl1_id and tbl2.fkcid = tbl1.cid
group by tbl3.tbl3_id, tbl3.fkcid, tbl3.fktbl2_id having count(*) > 1;