2017-08-08 59 views
1

我有一个表象下面这样:SQL查询来找到内,叶和根节点

ID P_ID 
1  2 
3  2 
6  8 
9  8 
2  5 
8  5 
5  null 

我已经使用了查询

SELECT ID, 
    CASE 
     WHEN P_ID IS NULL THEN 'Root' 
     WHEN NOT EXISTS (SELECT ID FROM MINOA.TREE WHERE P_ID=T0.ID) THEN 'Leaf' 
     ELSE 'Inner' 
    END T 
FROM MINOA.TREE T0 
ORDER BY ID; 

我得到的输出是:

ID  P_ID 
1  leaf 
2  inner 
3  leaf 
5  inner 
6  leaf 
8  inner 
9  leaf 

但是对于ID 5,它应该已经返回Root

+0

你为什么叫喊? –

+0

正因为如此,你再次调用表的时候,'SELECT ID FROM MINOA.TREE WHERE P_ID = T0.ID'。在这里显示更多细节。你怎么会出现'叶子'以及'内部'的结果。 –

回答

0

我已经创建这样的表:

+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | YES |  | NULL |  | 
| p_id | int(11) | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

有了自己的价值观:

+------+------+ 
| id | p_id | 
+------+------+ 
| 1 | 2 | 
| 3 | 2 | 
| 6 | 8 | 
| 9 | 8 | 
| 2 | 5 | 
| 8 | 5 | 
| 5 | NULL | 
+------+------+ 

执行这个查询:

SELECT id, CASE WHEN p_id IS NULL THEN 'Root' WHEN NOT EXISTS (SELECT id FROM tree WHERE p_id = t0.id) THEN 'Leaf' ELSE 'Inner' END as PROPERTY from tree t0 order by id; 

返回:

+------+----------+ 
| id | PROPERTY | 
+------+----------+ 
| 1 | Leaf  | 
| 2 | Inner | 
| 3 | Leaf  | 
| 5 | Root  | 
| 6 | Leaf  | 
| 8 | Inner | 
| 9 | Leaf  | 
+------+----------+