使用SQL将表中的两行合并为一行

使用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 我想把所有有父亲的人和父亲的名字列在一起。用户可以(当然)有最多一个父亲,但不一定有一个 写这样一个查询的最佳方式是什么?自联接,如果你想要没有父亲的孩子,就做一个左外联接

我正在尝试编写一个SQL查询(在Oracle DB中),它执行以下操作:

表:

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 |

做一个自联接。在这个时代,我们可以有很多父亲。:)