问题是您正在生成cartesian product。您现有的查询在两个表之间没有任何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
语法是一个伟大的visual explanation of joins。
见SQL Fiddle with Demo
INNER JOIN结果:
| 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 |
如果你想在你之间使用逗号然后你必须必须包括jo在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;
首先,你需要谷歌'join'来看看如何停止screwyness。那么你需要Google'Group By'来学习如何合计数字。 – Laurence
[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) –