You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询纠错:含Video技能员工去重列表查询语句问题排查

修正MySQL员工技能查询语句的问题

咱们来一步步拆解你这条MySQL查询的问题,然后给出正确的写法:

原语句存在的问题

  • 语法错误:SELECT子句里的Grade.Title, FROM多了一个逗号,这个多余的逗号会直接导致数据库抛出语法错误,无法执行。
  • 未完成关联与筛选:你只写到了INNER JOIN EmployeeSkill ON EmployeeSkill.EmployeeID...,但没完成关联逻辑,也没添加筛选条件来匹配包含video的技能。
  • 重复记录风险:如果直接关联EmployeeSkill表,一个员工如果拥有多个技能(其中包含video),会返回多条重复的员工记录,不符合“同一员工仅显示一条”的要求。

正确的查询写法

假设你的数据库表结构是标准的关联设计:Employee表存员工基础信息,Grade表存职级,EmployeeSkill是员工与技能的中间关联表,Skill表存技能名称(这是更规范的数据库设计)。下面提供两种可靠的写法:

方法1:使用DISTINCT去重(适合简单场景)

SELECT DISTINCT
    Employee.FirstName,
    Employee.LastName,
    Employee.Email,
    Grade.Title
FROM Employee
INNER JOIN Grade ON Grade.GradeID = Employee.GradeID
INNER JOIN EmployeeSkill ON EmployeeSkill.EmployeeID = Employee.EmployeeID
INNER JOIN Skill ON Skill.SkillID = EmployeeSkill.SkillID
WHERE Skill.Name LIKE '%video%';
  • 解释:通过INNER JOIN关联所有相关表,用LIKE '%video%'匹配名称包含video的技能,DISTINCT关键字会自动去除重复的员工记录,确保每个员工只显示一次。

方法2:使用EXISTS子查询(性能更优,推荐)

SELECT
    Employee.FirstName,
    Employee.LastName,
    Employee.Email,
    Grade.Title
FROM Employee
INNER JOIN Grade ON Grade.GradeID = Employee.GradeID
WHERE EXISTS (
    SELECT 1
    FROM EmployeeSkill
    INNER JOIN Skill ON Skill.SkillID = EmployeeSkill.SkillID
    WHERE EmployeeSkill.EmployeeID = Employee.EmployeeID
      AND Skill.Name LIKE '%video%'
);
  • 解释:EXISTS子查询会检查当前员工是否存在包含video的技能,只要找到匹配项就停止查询,不会产生重复记录,性能通常比DISTINCT更好,尤其是数据量较大时。

特殊情况:如果EmployeeSkill直接存储技能名称

如果你的EmployeeSkill表没有关联Skill表,而是直接在表中存储了技能名称字段(比如SkillName),可以简化为:

SELECT DISTINCT
    Employee.FirstName,
    Employee.LastName,
    Employee.Email,
    Grade.Title
FROM Employee
INNER JOIN Grade ON Grade.GradeID = Employee.GradeID
INNER JOIN EmployeeSkill ON EmployeeSkill.EmployeeID = Employee.EmployeeID
WHERE EmployeeSkill.SkillName LIKE '%video%';

内容的提问来源于stack exchange,提问作者Natasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:17