Postgresql
刪除從遞歸 CTE 生成的重複路徑
我有一些多父數據,我對其執行遞歸 CTE 以找到共同的祖先:
item_id |item_name |path_name |id_path_array | --------|----------|-------------|--------------| 1 |D |B->Two->D |{9,4,1} | 2 |E |B->Two->E |{9,4,2} | 13 |W |B->Two->D->W |{9,4,1,13} | 14 |Y |B->Two->D->Y |{9,4,1,14} | 15 |X |B->Two->E->X |{9,4,2,15} | 16 |Z |B->Two->E->Z |{9,4,2,16} |
但是,我真正想要的只是前兩行;我想刪除代表已被較短路徑覆蓋的路徑的行。例如,顯然如果“D”是一個共同的祖先,那麼所有 D 的祖先也是,所以我不想包括它們的路徑。
我確實認為我有一個數組運算符:
select * from common_ancestors q1 where exists ( select 1 from common_ancestors q2 where q1.id_path_array <@ q2.id_path_array and q1.item_id <> q2.item_id)
但即使它在這裡給出了正確的結果,我也不相信它是正確的。我很樂意聽到意見或替代解決方案。
期望的結果:
item_id | 項目名稱 | 路徑名 | id_path_array ------: | :-------- | :-------- | :------------ 1 | D | B->二->D | {9,4,1} 2 | E | B->二->E | {9,4,2}
db-fiddle這裡
您需要
NOT EXISTS
和contains
操作員相反:select q1.* from common_ancestors q1 where not exists ( select 1 from common_ancestors q2 where q1.id_path_array @> q2.id_path_array and q1.item_id <> q2.item_id ) ;
在**dbfiddle.uk中測試**