首页 > 解决方案 > 每个子集的新列

问题描述

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

我有一个像这样构建的小型足球运动员数据库:

玩家:[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 的总数一样多。

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

编辑:

所以,阐述我的问题:

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

标签: sqlpostgresql

解决方案


我认为您需要四个单独的玩家栏,而不是单个玩家栏。您可以使用四个“左外连接”来执行此操作,如下所示:

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

推荐阅读