一对多关系是单向的,也就是说,当你查询一对多关系时,可以使用“一”方来选取“多”方表中的多行,但不能使用一个“多”方行来选取多于一个的“一”方行。
第 60.1 节:示例公司表
考虑一个公司,每个管理人员(经理)管理一名或多名员工,而每个员工只有一名经理。
这会产生两个表:
员工表(EMPLOYEES)
| EMP_ID | FIRST_NAME | LAST_NAME | MGR_ID |
|---|---|---|---|
| E01 | Johnny | Appleseed | M02 |
| E02 | Erin | Macklemore | M01 |
| E03 | Colby | Paperwork | M03 |
| E04 | Ron | Sonswan | M01 |
经理表(MANAGERS)
| MGR_ID | FIRST_NAME | LAST_NAME |
|---|---|---|
| M01 | Loud | McQueen |
| M02 | Bossy | Pants |
| M03 | Barrel | Jones |
第 60.2 节:获取单个经理管理的员工
SELECT e.emp_id, e.first_name, e.last_name
FROM employees e
INNER JOIN managers m ON m.mgr_id = e.mgr_id
WHERE m.mgr_id = 'M01';
结果:
| EMP_ID | FIRST_NAME | LAST_NAME |
|---|---|---|
| E02 | Erin | Macklemore |
| E04 | Ron | Sonswan |
最终,对于每个查询的经理,会看到一名或多名员工。
第 60.3 节:获取单个员工的经理
参考上述示例表。
SELECT m.mgr_id, m.first_name, m.last_name
FROM managers m
INNER JOIN employees e ON e.mgr_id = m.mgr_id
WHERE e.emp_id = 'E03';
结果:
| MGR_ID | FIRST_NAME | LAST_NAME |
|---|---|---|
| M03 | Barrel | Jones |
作为上述示例的反向操作,我们知道对于查询的每个员工,只会看到对应的一名经理。