我正在努力研究如何从我们的表格中获取团队领导者和团队成员的完整列表。 包括那些没有团队的团队领导。
我们有一个基本的数据结构,我们有一个表person
,其中包含我们的基本人物对象。对于某些人,我们将此表扩展到details
表中。
我们拥有的一条扩展信息是team_leader状态。我们有两个相关的详细信息来定义:detail_isTeamLeader
和detail_teamLeader
。
第一个是布尔值,定义了一个简短的团队领导者列表。第二个定义了一个人团队负责人(理想情况下来自子集)。
_person table_
person_id
person_name
_detail table_
detail_id
detail_person_id
detail_isTeamLeader
detail_teamLeader
我可以使用以下查询让所有拥有团队的团队负责人:
SELECT tl.person_id AS tlref, tl.person_name AS tlname,
per.person_id AS perref, per.person_name AS pername
FROM detail
LEFT OUTER JOIN person AS per ON detail.person = per.person_id
LEFT OUTER JOIN person AS tl ON detail_teamleader = tl.person_id
ORDER BY tlname, psname
但是,对于那些detail.isTeamLeader
为真但但未在detail_teamLeader
字段中出现的team_leaders,这会失败。
样本数据
person_id person_name
1 Joe Bloggs
2 Fred Smith
3 Frank Jones
4 Amy Kelly
detail_id detail_person_id detail_isTeamLeader detail_teamLeader
1 1 1 0
2 2 1 0
3 3 0 3
4 4 0 3
在上面的示例中,Joe和Fred是团队领导。但是,Joe在他的团队中没有人,因此在结果集中省略了上面的查询。
我怀疑规范化数据结构可能是最好的答案,但有没有办法不这样做?
答案 0 :(得分:1)
我理解您在人与细节之间存在一对一的关系,但并非所有人都有详细信息。
我不确定您是否只想让团队中的所有人(包括那些没有团队的人)获得团队领导,或者您想要一个包含所有人员的数据集团队领导信息。
在第一种情况下,您必须使用内部选择(或Sql server中的CTE)来选择所有团队领导者,并将其与详细信息和人员表联系起来。以下是您可以使用的查询:
select tl.person_id as tlref, tl.name as tlname, p.person_id as perref, p.name as pername
from (
select p.person_id,p.name
from @persons p
inner join @details d on d.person_id = p.person_id and d.is_temamleader = 1
) tl
left outer join @details d on d.team_leader = tl.person_id
left join @persons p on p.person_id = d.person_id
对于第二种情况(让所有人获得团队负责人信息):
select p.person_id as perref, p.name as pername, d.is_teamleader, pTl.person_id as tlref, ptl.name as tlname
from @persons p
left outer join @details d on d.person_id = p.person_id
left outer join @persons pTl on pTl.person_id = d.team_leader
我怀疑第一个查询是你要求的,但我添加了第二个查询以防你需要它。请注意,我使用了表变量(@persons,@ details),所以用实际的表名替换它们。
答案 1 :(得分:0)
如果您需要所有团队领导和表'人'的所有记录 表'详细'中的相应记录我认为您可以使用此代码:
SELECT
person_id, person_name
FROM
person
LEFT JOIN
detail
ON
person.person_id = detail.person
WHERE
detail.detail_isTeamLeader = 1