首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSSQL -无法计算如何连接三个表以找到包含具有正确技能的人员的建筑物。

MSSQL -无法计算如何连接三个表以找到包含具有正确技能的人员的建筑物。
EN

Stack Overflow用户
提问于 2016-04-21 11:03:09
回答 4查看 36关注 0票数 0

在我的一生中,我无法找到一个查询,该查询将获取Skill_ID的列表,并返回包含搜索到的所有技能的人/人的建筑物列表

我现在有这些桌子

代码语言:javascript
复制
Building
===========
ID | name
===========
1  | BlockA
2  | BlockB


People
============================
ID |   name   |  Building_ID 
============================
1  | PersonA  |       1
2  | PersonB  |       2

Skills
===========
ID | name
===========
1  | SkillA
2  | SkillB

SkillsToPerson
====================
Person_ID | Skill_ID
====================
    1     |    1
    1     |    2 
    2     |    2

例如,我想找到至少有一个SkillA和SkillB的建筑,BlockA应该返回,因为Person1有两种技能,并且在BlockA。

有人能给我一些建议吗?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-21 11:12:39

您可以使用GROUP BYHAVING来完成这一任务。

代码语言:javascript
复制
SELECT b.Name AS Building
FROM Building b JOIN
     People p
     ON b.ID = p.Building_ID JOIN
     SkillsToPerson sp
     ON p.ID = sp.Person_ID
WHERE sp.skill_id IN (1, 2, 3)            -- Skill IDs to look for
GROUP BY b.Name
HAVING COUNT(DISTINCT sp.skill_id) = 3;   -- 3 skills

请注意,您不需要Skills表,因为您具有SkillsToPerson中的技能id。类似地,如果您对建筑id感到满意,则不需要building表。

我将这种类型的查询称为“集内集”查询,因为您正在寻找另一个(建筑物)中的某物(技能)集。GROUP BYHAVING为处理这类查询提供了一种非常灵活的方法。

票数 2
EN

Stack Overflow用户

发布于 2016-04-21 11:08:37

不如:

代码语言:javascript
复制
SELECT DISTINCT Building.Name
FROM People
INNER JOIN Building
ON Building.ID = People.Building_ID
INNER JOIN SkillsToPerson
ON SkillsToPerson.Person_ID = People.ID
INNER JOIN Skills
ON Skills.ID = SkillsToPerson.Skills_ID
WHERE Skills.Skill_ID IN (1, 2, 3, ...) -- list of skills here
票数 1
EN

Stack Overflow用户

发布于 2016-04-21 11:10:53

那这个呢?

代码语言:javascript
复制
SELECT *
FROM people p
LEFT JOIN building b ON p.building_id = b.id
LEFT JOIN skillstoperson s ON p.id = s.person_id
LEFT JOIN skill sn ON s.skill_id = sn.id
WHERE s.skill_id = @myskill;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36767640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档