使用SQL将表中的两行合并为一行
我正在尝试编写一个SQL查询(在Oracle DB中),它执行以下操作: 表:使用SQL将表中的两行合并为一行,sql,oracle,Sql,Oracle,我正在尝试编写一个SQL查询(在Oracle DB中),它执行以下操作: 表: Id | Name | Father_id 1 | John | 2 2 | Peter | 3 | Ann | 2 预期结果: Name | Father_Name John Peter Ann Peter 我想把所有有父亲的人和父亲的名字列在一起。用户可以(当然)有最多一个父亲,但不一定有一个 写这样一个查询的最佳方式是什么?自联接,如果你想要没有父亲的孩子,就做一个左外联接
Id | Name | Father_id
1 | John | 2
2 | Peter |
3 | Ann | 2
预期结果:
Name | Father_Name
John Peter
Ann Peter
我想把所有有父亲的人和父亲的名字列在一起。用户可以(当然)有最多一个父亲,但不一定有一个
写这样一个查询的最佳方式是什么?自联接,如果你想要没有父亲的孩子,就做一个左外联接
select *
from table t_child join
table t_father on t_child.father_id = t_father.id
试试这个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
您需要使用left,因为您提到不一定需要使用一个自联接(和两个表/索引扫描),而是可以使用分层查询: 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
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
| NAME | FATHER_NAME |
|-------|-------------|
| Peter | (null) |
| John | Peter |
| Ann | Peter |
查询1:
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
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
| NAME | FATHER_NAME |
|-------|-------------|
| Peter | (null) |
| John | Peter |
| Ann | Peter |
:
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
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
| NAME | FATHER_NAME |
|-------|-------------|
| Peter | (null) |
| John | Peter |
| Ann | Peter |
做一个自联接。在这个时代,我们可以有很多父亲。:)