sql - 每个子集的新列
问题描述
在这个例子中,我想调用一个表的所有行。但是,可以在子集中再次找到表的内容。看:
我有一个像这样构建的小型足球运动员数据库:
玩家:[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?
解决方案
我认为您需要四个单独的玩家栏,而不是单个玩家栏。您可以使用四个“左外连接”来执行此操作,如下所示:
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
推荐阅读
- cordova - Cordova 停止从钩子构建
- java - 使用spring esTemplate删除文档中的字段
- python - Scrapy 如何使用 itemloader 填充空项目?
- asp.net-core - 如何在类库项目中使用 AspNetCore 3.0 功能/组件
- html - 应用 type=password 时文本框失去 CSS 样式
- python - 如何调用数组中的所有图像?
- javascript - Eventemitter 循环依赖改进(已关闭)
- python - TypeError: unhashable type: 'dict' for some 50% of the logic where the remaining 50% is working fine
- python - 如何逐行读取并对每一行进行一些操作
- laravel - laravel 验证失败后显示旧的帖子数据