问题是您正在生成笛卡尔积。JOIN
您现有的查询在两个表之间没有任何条件。您需要JOIN
以下表格:
SELECT d.Location, d.DeptNo, e.Ename
FROM DEPARTMENTS d
INNER JOIN EMPLOYEES e
on d.deptno = e.deptno
WHERE e.DeptNo IN (10, 30)
Order BY Location ASC;
如果您在学习JOIN
语法方面需要帮助,这里有一个很好的连接可视化解释。
请参阅带有演示的 SQL Fiddle
内部加入结果:
| LOCATION | DEPTNO | ENAME |
-----------------------------
| Loc2 | 10 | emp2 |
| Loc2 | 10 | emp3 |
| Loc3 | 30 | emp6 |
| Loc3 | 30 | emp4 |
| Loc3 | 30 | emp5 |
不使用JOIN
语法的笛卡尔查询将产生如下结果(参见SQL Fiddle with Demo):
| LOCATION | DEPTNO | ENAME |
-----------------------------
| Loc1 | 1 | emp6 |
| Loc1 | 1 | emp4 |
| Loc1 | 1 | emp2 |
| Loc1 | 1 | emp5 |
| Loc1 | 1 | emp3 |
| Loc2 | 10 | emp3 |
| Loc2 | 10 | emp6 |
| Loc2 | 10 | emp4 |
| Loc2 | 10 | emp2 |
| Loc2 | 10 | emp5 |
| Loc3 | 30 | emp3 |
| Loc3 | 30 | emp6 |
| Loc3 | 30 | emp4 |
| Loc3 | 30 | emp2 |
| Loc3 | 30 | emp5 |
如果你想在你的 then 之间使用逗号,则必须在子句中包含连接条件,WHERE
这将产生与版本相同的结果INNER JOIN
:
select d.Location, d.DeptNo, e.ename
from departments d, employees e
WHERE e.DeptNo IN (10, 30)
and d.deptno = e.deptno
Order BY Location ASC;