首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询一对多关系

SQL查询一对多关系
EN

Stack Overflow用户
提问于 2013-03-06 23:45:57
回答 5查看 110.3K关注 0票数 18

我有一张供员工使用的桌子,还有一张带培训的桌子。“培训”表包含员工已完成的各种培训课程。我们有强制性的安全意识培训,所以每个员工都必须完成这个培训课程。我在运行一个查询时遇到了问题,该查询将返回列出的所有完成培训或未完成培训的员工。

示例Employee表

代码语言:javascript
运行
复制
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║  1 ║ Bob  ║
║  2 ║ Tom  ║
║  3 ║ John ║
╚════╩══════╩

示例训练表

代码语言:javascript
运行
复制
╔════╦══════════════╦════════════════════╗
║ ID ║ DEPARTMENT_ID║       CLASS        ║
╠════╬══════════════╬════════════════════╣
║  1 ║           1  ║ Security Awareness ║
║  2 ║           1  ║ Workplace Safety   ║
║  3 ║           2  ║ Security Awareness ║
╚════╩══════════════╩════════════════════╝

目标结果

代码语言:javascript
运行
复制
╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

我使用的查询是

代码语言:javascript
运行
复制
SELECT employee.id, employee.name, training.class
FROM employee
JOIN training ON employee.id = training.department_id
WHERE training.class LIKE '%SECURITY%'
ORDER BY employee_id

缺少“安全意识”课程的员工根本不会出现,而是掉到了裂缝里。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-06 23:50:17

在表的连接过程中使用LEFT JOIN并移动过滤条件(特别是在ON子句中)

另一个问题是使用单引号:' '而不是‘ ’

代码语言:javascript
运行
复制
SELECT  employee.id, 
        employee.name, training.class
FROM    employee   
        LEFT JOIN training 
            ON employee.id = training.department_id AND
                training.class LIKE '%SECURITY%'
ORDER   BY employee.id

  • SQLFiddle Demo

结果

代码语言:javascript
运行
复制
╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝
票数 22
EN

Stack Overflow用户

发布于 2013-03-06 23:48:26

您正在执行内部连接,您需要的是左外部连接。不同之处在于:内连接仅在连接表中存在匹配的情况下才会产生结果。left outer join将返回主表中的所有结果,而不管连接表中是否有结果。

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 23:50:04

使用左外部连接而不是连接。我还会将WHERE子句改为

代码语言:javascript
运行
复制
WHERE training.Id = 1

如果这是等价的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15251761

复制
相关文章

相似问题

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