2016-07-22 48 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