我正在尝试编写一个执行以下操作的SQL查询(在Oracle DB中):
表:
Id | Name | Father_id
1 | John | 2
2 | Peter |
3 | Ann | 2
预期结果:
Name | Father_Name
John Peter
Ann Peter
我想列出父亲一行中有父亲的所有人。用户可以(当然)最大。一个父亲,但没有必要。
这是编写此类查询的最佳方式吗?
答案 0 :(得分:2)
自我加入,如果你想要没有父亲的孩子,可以做左外连接
select *
from table t_child join
table t_father on t_child.father_id = t_father.id
答案 1 :(得分:0)
尝试这个sql它将确定无误地工作
select child.MenuName as ChildName,parent.MenuName as ParentName from table_name as child
left join table_name as parent on child.parentId = parent.MenuId
你需要使用左,因为你提到的不一定是
答案 2 :(得分:0)
您不需要使用自联接(以及两个表/索引扫描),而是可以使用分层查询来执行此操作:
Oracle 11g R2架构设置:
CREATE TABLE people ( Id, Name, Father_id ) AS
SELECT 1, 'John', 2 FROM DUAL UNION ALL
SELECT 2, 'Peter', NULL FROM DUAL UNION ALL
SELECT 3, 'Ann', 2 FROM DUAL
查询1 :
SELECT name,
PRIOR name AS father_name
FROM people
WHERE LEVEL > 1
OR CONNECT_BY_ISLEAF = 0 -- Comment out if you do not want Peter,NULL
CONNECT BY PRIOR id = father_id
<强> Results 强>:
| NAME | FATHER_NAME |
|-------|-------------|
| Peter | (null) |
| John | Peter |
| Ann | Peter |