每个子集的新列

时间:2018-12-14 18:31:19

标签: sql postgresql

在此示例中,我想调用表的所有行。但是,可以再次在子集中找到表的内容。看:

我有一个小型的足球运动员数据库,其构建方式如下:

播放器:[PID,名称,编号]

守门员:[PID]

后卫:[PID,侧面]

中场:[PID,专业]

攻击者:[PID,StrongFoot]

所以我想做的是,而不是在player.name栏中输入一栏,我希望将守门员,后卫,中场和进攻者的名字放在不同的栏中。我尝试为初学者做的是:

select distinct gk.name, def.name 
from (select p.name
from player p, goalkeeper g 
where p.pid = g.pid) gk, (select p.name
from player p, defender d 
where p.pid = d.pid) def

但这给了我几个结果(充其量)。因此,每个条目都是针对某个守门员,例如,其重复次数与def.name的总数相同。

什么是可接受的/好的方法?

编辑:

所以,要说明我的问题:

假设我的数据库{“ GK1”,“ GK2”}中有2名守门员,还有6名防御者{“ D1”,“ D2”,“ D3”,“ D4”,“ D5”,“ D6”}。如果我运行上面的查询,则会得到两列,但不是分别有2和6个条目,而是每列12个。在守门员中,每个ID重复6次,在“后卫”列中,每个条目重复2次。有没有一种方法可以在每列中仅显示不同的值(因此一次提及每个ID)并设置另一个NULL?

1 个答案:

答案 0 :(得分:0)

我认为您希望与玩家一起使用四个单独的列,而不是单个玩家列。您可以使用四个“左外部连接”来完成此操作,如:

select
  p.pid,
  case when g.pid is not null then p.name end as goalkeeper,
  case when d.pid is not null then p.name end as defender,
  case when m.pid is not null then p.name end as midfielder,
  case when a.pid is not null then p.name end as attacker
from player p
left join goalkeeper g on g.pid = p.pid
left join defender d on d.pid = p.pid
left join midfieldfer m on m.pid = p.pid
left join attacker a on a.pid = p.pid