Postgresql

同一張表中的父子關係。選擇查詢僅獲取父記錄和記錄不屬於父子關係

  • November 11, 2020

我在同一張表中有一張帶有父子關係的表。一些樣本數據

 id │ name                 │ parent │ is_active  
════╪══════════════════════╪════════╪═══════════ 
 1  │ Company A            │ null   │ true       
 2  │ Child of A           │ 1      │ true       
 3  │ 2Child of A          │ 1      │ true       
 4  │ 3Child of A          │ 1      │ true       
 5  │ 0 Single Company     │ null   │ true       
 6  │ 1 Single Company     │ null   │ true       
 7  │ 2 Single Company     │ null   │ true       
 8  │ Parent Company B     │ null   │ true       
 9  │ 0 Child Company of B │ 8      │ true       
 10 │ 1 Child Company of B │ 8      │ true       
 11 │ 2 Child Company of B │ 8      │ true       
 12 │ 3 Child Company of B │ 8      │ true   

我想寫兩個查詢

  1. 獲取所有父記錄(僅父記錄) 範例:id 1,8
  2. 獲取所有單條記錄(僅記錄不屬於父子) 範例:5,6,7

請幫助編寫選擇查詢。

SELECT t1.*
FROM "table" t1
WHERE t1.parent IS NULL
 AND /* NOT */ EXISTS (SELECT 1
                       FROM "table" t2
                       WHERE t1.id = t2.parent)

EXISTS - 用於父記錄。

NOT EXISTS - 用於單個記錄。

如果可能的話,您能否詳細說明您的問題,同時編寫您的 Select 查詢以便更好地理解。

正如您所說的“同一張表中的父子關係”,您的意思是將所有父值都返回為不同的值嗎?

然後,

  1. 獲取所有父記錄(僅父記錄) 範例:id 1,8
SELECT DISTINCT parent
FROM "table_name" t1
WHERE parent IS NOT NULL;
  1. 獲取所有單條記錄(僅記錄不屬於父子) 範例:5,6,7
SELECT DISTINCT id
FROM "table_name" t1
WHERE t1.id= t1.parent IS NULL;

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