【问题标题】:SQL Query that fetches All the Names of the Mechanic that have all the skills in the skillsRequired table获取具有 SkillRequired 表中所有技能的机械师的所有名称的 SQL 查询
【发布时间】:2016-06-01 14:28:26
【问题描述】:

我有一个表 Mechanic,其中包含类似的行

MechName 机械技能

    A            Bike Repair
    A            Car Repair
    B            Bike Repair
    B            Car Repair
    B            Oil Change
    C            Oil Change

需要其他餐桌技能

技能

    Bike Repair
    Oil Change
    Car Repair.

需要编写一个查询来获取具有 SkillsRequired 表中列出的所有技能的机械师的所有姓名。

答:只有 B 必须出现在结果中,因为只有 B 具备所需的全部 3 项技能。 PS:对涉及 groupby 和 counts 的解决方案有一个想法,但这可能并不完全正确。

感谢@inquisitive_mind 提供以下解决方案。但是我们可以用不同的方式来表述吗?我需要另一个完全符合以下查询的查询。

    select MechName from Skills a join Mechanic b
    on a.Skills = b.MechSkill
    group by Mechname
    having count(MechSkill) = (select count(*) from Skills)

【问题讨论】:

  • 这是 MySQL 还是 SQL Server?它们不是一回事。
  • 我当然希望您的真实表不要在两个表中都存储这些字符串。
  • @Rabbit 这是用于 SQL Server 的
  • @SeanLange 它们确实存储在 2 个不同的表中
  • 您可以考虑阅读规范化。将这样的文本存储在多个表中是很痛苦的。考虑当您必须更改技能的描述时会发生什么。您还必须在引用它的所有其他表中更新它,这违背了关系数据的目的。

标签: mysql sql sql-server sql-server-2008


【解决方案1】:

我正在编辑我的回复,以便您也可以搜索项目组合。

SELECT MechName, COUNT(DISTINCT Skill)
FROM Mechanic
WHERE Skill IN ('Oil Change', 'Car Repair', 'Bike Repair')
GROUP BY MechName
HAVING COUNT(DISTINCT Skill) = 3;

【讨论】:

  • 感谢 Langosta 的回复。但是如果技能要求表中列出的技能是汽车修理和自行车修理,但机械师有技能换油和换胎怎么办。即使技能不同,计数也会匹配并给出误报。
  • 我已更改为回复,以便您可以调整此逻辑并设置项目组合,而不仅仅是所有项目。
  • 我希望 Where Skill in () 部分是动态的,它必须从 Skills Required 表中获取所有值
  • 我不知道为什么原始答案不符合条件,那么,如果你真的想要所有技能。但是,您可以随意将其更改为 Skill IN (SELECT Skills FROM Skills)。这主要是为了向您展示基本逻辑。您将不得不根据您的特定需求对其进行调整。
  • 我也被要求引入替代解决方案。对此有什么想法吗?
【解决方案2】:
select MechName from Skills a join Mechanic b
on a.Skills = b.MechSkill
group by Mechname
having count(MechSkill) = (select count(*) from Skills)

【讨论】:

  • 谢谢!这就是我一直在寻找的。另外,您还有其他想法以不同的方式制定相同的内容吗?我正在寻找同一用例的多个实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多