Postgresql

刪除從遞歸 CTE 生成的重複路徑

  • January 9, 2019

我有一些多父數據,我對其執行遞歸 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 EXISTScontains操作員相反:

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中測試**

引用自:https://dba.stackexchange.com/questions/226693