我一直在努力寻找最后一小时。
我需要查看哪些员工在10和30部门工作以及他们工作的位置。有一个员工表,其中列出了员工姓名和部门号,以及一个部门表,即位置和部门号。
这是我试过的:
SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS, EMPLOYEES
WHERE Employees.DeptNo IN (10, 30)
Order BY Location ASC;
结果很棘手,例如,当我输入的数据没有反映这一点时,它列出了多个城市的员工。
答案 0 :(得分:1)
问题是您正在生成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。
INNER加入结果:
| 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 |
如果您想在您之间使用逗号,那么必须在WHERE
子句中包含连接条件,这将产生与INNER JOIN
版本相同的结果:< / p>
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;
答案 1 :(得分:0)
试试这个:
SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS JOIN EMPLOYEES ON (Departments.DeptNo = Employees.DeptNo)
WHERE Employees.DeptNo IN (10, 30)
Order BY Location ASC;
答案 2 :(得分:0)
您没有使用primary-foreign加入表格,因此您获得了笛卡尔结果:
SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS, EMPLOYEES
WHERE Employees.DeptNo IN (10, 30)
AND Employees.DeptNo = DEPARTMENTS.DeptNo -- <-------
Order BY Location ASC;
答案 3 :(得分:0)
现在有点毫无意义,但评论很有趣:
原始要求
Select
Count(*)
From
Employees e
Where
e.DeptNo In (10, 30)
澄清要求
Select
*
From
Employees e
Where
e.DeptNo In (10, 30)
很好,你学到了关于连接的东西,但你似乎还不需要它们来回答这个问题?只有现在你会说你还需要他们的位置?该死的我和我的精神能力。就像不复制另一个答案一样。 (请不要在现实中使用它)
Select
(select
d.location
from
departments d
where
d.deptno = e.deptno
) as Department,
e.*
From
Employees e
Where
e.DeptNo In (10, 30)
看起来仍然没有加入! (不是真的)