使用 sql 查询显示团队名称和父名称

display team name and parent name using sql query

我有两个table

团队table

id               name
1                A
2                B
3                B1
4                B2

Team_mapping table

id              team_id        parentid
1               1              0
2               2              0
3               3              2
4               4              2

显示应该是这样的

 Team Name        Parent Name
 A                   - 
 B                   -
 B1                  B
 B2                  B

请帮我写一个sql与上面显示相同的查询输出

一种方法是使用 left join,并加入 teams 两次:

select
    coalesce(t1.name, '-') "Team Name", coalesce(t2.name, '-') "Parent Name"
from team_mapping tm
left join teams t1 on tm.team_id = t1.id
left join teams t2 on tm.parentid = t2.id

那么你可以在select语句中使用子查询:

select
    coalesce((select t.name from teams t where t.id = tm.team_id), '-') "Team Name",
    coalesce((select t.name from teams t where t.id = tm.parentid), '-') "Parent Name"
from team_mapping tm

编辑: 前一个答案的 join 不正确,如果 table 中没有 parentid,则应为 left join teams。此外,对于 null s,使用 coalesce 转换为 -.

Demo 在 sqlfiddle 中。

这是个坏主意。有两种方法可以做到这一点,

  1. ltree
  2. 层级单一table

使用分级单table最适合你。这是一个小的重组,但它更加语义化。

CREATE TABLE teams (
  id      serial PRIMARY KEY,
  parent  int    REFERENCES teams,
  name    text
);

INSERT INTO teams (id, parent, name) VALUES
  ( 1, null, 'A'  ),
  ( 2, null, 'B'  ),
  ( 3, 2,    'B1' ),
  ( 4, 2,    'B2' );

有关此的递归查询示例..

WITH RECURSIVE t(id,name,parent) AS (
  SELECT t1.id, t1.name, ARRAY[]::text[]
  FROM teams AS t1
  WHERE parent IS NULL
  UNION ALL
    SELECT t2.id, t2.name, t1.parent || ARRAY[t1.name]
    FROM t AS t1
    JOIN teams AS t2
    ON t2.parent = t1.id
)
SELECT *
FROM t;

 id | name | parent 
----+------+--------
  1 | A    | {}
  2 | B    | {}
  3 | B1   | {B}
  4 | B2   | {B}
(4 rows)

这允许任意深的层次结构。

INSERT INTO teams (id, parent, name) VALUES
  ( 5, 4, 'Deep' );

运行同上查询,

 id | name | parent 
----+------+--------
  1 | A    | {}
  2 | B    | {}
  3 | B1   | {B}
  4 | B2   | {B}
  5 | Deep | {B,B2}
(5 rows)