从 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
- 检查如果 PARENT US NULL 然后 ROOT
- 如果节点在父列中,则 'INNER'
- 否则'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
给定 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
- 检查如果 PARENT US NULL 然后 ROOT
- 如果节点在父列中,则 'INNER'
- 否则'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