2016-07-22 53 views
-1

我有一种情况,即已将重复数据插入某些表中。SQL查找具有多个父记录的子项

鉴于以下数据库架构,我想查找所有记录与s_id和co_id组合关联的表A中的多个记录。突出显示的行是我正在寻找的行,基于查找重复项I需要从表A中找到与重复记录关联的ID。

我可以通过s_id & co_id进行分组来确定潜在的重复项,但是因为表B是1:M,这并不完全准确。

Select c.s_id, c.co_id, Count(*) 
from c 
    INNER JOIN b on c.b_id = b.id 
    INNER JOIN a on a.id = b.a_id 
Group By c.s_id, c.co_id 
Having count(*) > 1; 

ERD enter image description here

+0

是C_ID = 5应该被加入到A_ID = B_ID = 4?为什么不在下面的行? – kbball

+0

是的,这就是它的设置 –

+1

新图片有帮助 – kbball

回答

2

我觉得你只是想count(distinct)

Select c.s_id, c.co_id, Count(distinct a.id) 
from c join 
    b 
    on c.b_id = b.id join 
    a 
    on a.id = b.a_id 
Group By c.s_id, c.co_id 
having count(distinct a.id) > 1; 
+0

我喜欢答案,但从数据来看,他看起来好像他试图从给定的a.id中拉出多条记录。此外,它看起来不像加入是有效的,因为有数据显示a.id <> b.id <> c.id – kbball

+0

我认为MySQL在该场景中不会允许DISTINCT,但它看起来这就是我所追求的。 –

+0

@JaredKnipp。 。 。 MySQL绝对支持'COUNT(DISTINCT)'。 –

1

戈登的回答,会得到s_idco_id值。如果你需要追踪那些回a那就试试这个:

select distinct a.id 
from 
    a inner join b on b.a_id = a.id inner join c on c.b_id = b.id inner join 
    (
     select c.s_id, c.co_id 
     from a inner join b on b.a_id = a.id inner join c on c.b_id = b.id 
     group by c.s_id, c.co_id 
     having count(distinct a.id) > 1 
    ) as dups 
     on dups.s_id = c.s_id and dups.co_id = s.co_id 
相关问题