从 table 中获取根节点、内部节点和叶节点?

Get root, inner, and leaf nodes from a table?

给定 table 个节点(它们的 ID 和它们的父 ID),我怎样才能获得所有根节点、内部节点和叶节点?

这是我目前的情况:

根节点

SELECT Id, "Root" FROM NodeTable
WHERE ParentId IS NULL;

内部节点

???

叶节点

SELECT N1.Id, "Leaf" FROM NodeTable N1
LEFT JOIN NodeTable N2 ON N1.Id = N2.ParentId
WHERE N2.ParentId IS NULL;

这是正确的吗?有没有一种方法可以在一次查询中完成此操作?

您的 "Inner Nodes" 查询可以与您的 "Leaf Nodes" 查询类似地派生。

SELECT DISTINCT N1.Id, "Inner"
FROM NodeTable N1
JOIN NodeTable N2
  ON N2.ParentId = N1.ID
WHERE N1.ParentId IS NOT NULL;

这将为您提供所有不是根节点(因为它们具有非空 ParentId)且具有子节点 (N2) 的节点 (N1)。

是的,您可以使用 UNION 关键字在一个查询中完成所有这些操作。

SELECT Id, "Root" 
FROM NodeTable
WHERE ParentId IS NULL
UNION
SELECT DISTINCT N1.Id, "Inner"
FROM NodeTable N1
JOIN NodeTable N2
  ON N2.ParentId = N1.ID
WHERE N1.ParentId IS NOT NULL
UNION
SELECT N1.Id, "Leaf" 
FROM NodeTable N1
LEFT JOIN NodeTable N2 
  ON N1.Id = N2.ParentId
WHERE N2.ParentId IS NULL;
select  case 
        when p is null then concat(n, ' Root')
        when n in (select distinct p from bst) then concat(n, ' Inner')
        else concat(n, ' Leaf')
    end
from bst
order by n asc
select t.N,
case  
      when t.P is null then 'Root'
      when t.N in (select t1.P from  BST t1 where t1.P = t.N) then 'Inner' 
      else 'Leaf' 
end
from BST t
order by t.N 
select n, (case when p is null then "Root" when n in (select p from bst) then "Inner" else "Leaf" end) from BST order by n;

select n,case when p in (select n from bst ) then case when n in (select p from bst) then "Inner" else "Leaf" end else "Null" end from bst order by n ;

我相信它来自这个 link: https://www.hackerrank.com/challenges/binary-search-tree-1/problem

这是你可以做的!

SELECT N, IF(P IS NULL, 'Root', IF((SELECT COUNT(*) FROM BST WHERE P=B.N)>0,'Inner','Leaf')) 
FROM BST AS B 
ORDER BY N;

这是另一个选项:

SELECT distinct N1.N,
  Case
        When N1.P is null then 'Root'
        When N2.P is null then 'Leaf'
        Else 'Inner'
  End
FROM BST N1
LEFT JOIN BST N2 
  ON N1.N = N2.P
ORDER BY N1.n

您的根叶逻辑似乎是正确的。内部通常是其他一切

如果你想在 1 SQL 代码中执行这个那么你可以试试这个

SELECT DISTINCT Id,
CASE WHEN Id NOT IN (SELECT DISTINCT ParentId FROM NodeTable WHERE ParentId IS NOT NULL ) 
     THEN "Leaf"
      WHEN ParentId IS NULL THEN "Root"
      ELSE "Inner"
      END AS NodeType
FROM NodeTable
ORDER BY Id

下面是我的解决方案:

 select N,case when level=1 then 'Root'
               when connect_by_isleaf=1 then 'Leaf'
               when level>1 and connect_by_isleaf=0 then 'Inner' 
          end
 from BST
 start with p is null
 connect by p=prior N
 order by N;

select n, 案例 当 p 为 null 时 'Root' 当 n 在 (select p from bst) 时 'Inner' 否则 'Leaf' 结尾 来自 bst 按 n 排序;

Select distinct(N),x
from(
select N,P,
case when P is null and N is not null then 'Root'
when N in (Select distinct(P)from BST where P is not null) then 'Inner' 
else 'Leaf' end as x
from BST)a
order by N;

简短高效

    SELECT N , CASE WHEN P is null THEN 'Root' ELSE 
   (IF (N IN (SELECT P FROM BST ), 'Inner','Leaf' ) ) END FROM BST ORDER BY N
select N, 'Root' from N1 where P is null
UNION
select N, 'Leaf'  from N1 where N not in (select P from N1 where p is not 
                                           null) 
UNION
select N , 'Inner' from N1 where N  in 
(select P from N1 where p NOT IN (select N from N1 where P is null)) 
order by n;

你也可以试试..

selectN, 当 B.p 为 NULL 时 'Root' 当 B.N IN(select p from BST) then 'Inner' 否则 'Leaf' 终端案例 来自 BST B 按 N 排序;

更简洁的方式:

SELECT 
    N, 
    IF(
        P IS NULL, 
        'Root', 
        IF(
            (
                SELECT COUNT(*) 
                FROM BST 
                WHERE P=B.N
            ) > 0, 
           'Inner', 
           'Leaf'
       )
    ) 
FROM BST AS B 
ORDER BY N;

SELECT 
    N, 
    IF(
        P IS NULL, 
        'Root', 
        IF(
            B.N IN (SELECT P FROM BST),
           'Inner', 
           'Leaf'
       )
    ) 
FROM BST AS B 
ORDER BY N;

您可以使用 exist 和 not exists :

selectN,'Root' 来自 BST,其中 p 为空 联盟 selectN,'Leaf' 来自 BST 哪里不存在(select * 来自 BST b where b.P =a.N ) 工会
selectN,'Inner' 来自 BST 其中存在(select * 来自 BST b,其中 b.P =a.N 且 a.P 不为空);

selectn , 当 p 为 null 时 'Root' 当 n 在(select 与 bst 不同的 p 时)则 'Inner' else 'Leaf' 以 t

结束

从 bst 按 1 排序;

SELECT N,CASE WHEN ISNULL(P,0) = 0 THEN 'Root'
WHEN N IN (SELECT P FROM BST ) THEN 'Inner'
ELSE 'Leaf'
END NODETYPE
FROM BST
ORDER BY N
  1. 检查如果 PARENT US NULL 然后 ROOT
  2. 如果节点在父列中,则 'INNER'
  3. 否则'LEAF'

    SELECT DISTINCT(N), 'Root' FROM BST WHERE P IS NULL UNION 
    SELECT DISTINCT(N), 'Leaf' FROM BST WHERE N NOT IN (SELECT 
    DISTINCT(P) FROM BST WHERE P IS NOT NULL) UNION 
    SELECT DISTINCT(N), 'Inner' FROM BST WHERE N IN (SELECT 
    DISTINCT(P) FROM BST) AND P IS NOT NULL;

WHERE   
Root= Parent is null,  
leaf= when a Particular node is not a parent for any node,  
Inner= when a Particular node is a parent for any node
select N, 'Root' from BST where P is null
UNION
select N, 'Leaf'  from BST where N not in (select P from BST where p is not 
                                       null) 
UNION
select N , 'Inner' from BST where N  in 
(select P from BST where p NOT IN (select N from BST where P is null)) 
order by n;

其他方式:

SELECT 
N, 
DECODE(P, NULL, 'Root', DECODE(N, (SELECT DISTINCT S.P FROM BST S WHERE S.P=B.N),'Inner', 'Leaf')) FROM BST B
ORDER BY N;
select N, Case 
when P is null then 'Root' 
when N in (select P from BST) then 'Inner'
Else 'Leaf' end from BST order by N asc