使用 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 中。
这是个坏主意。有两种方法可以做到这一点,
ltree
- 层级单一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)
我有两个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 中。
这是个坏主意。有两种方法可以做到这一点,
ltree
- 层级单一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)