0

在过去的一个小时里,我一直在努力解决这个问题。

我需要查看哪些员工在部门 10 和 30 工作,以及他们工作的地点。有一个员工表,其中列出了员工姓名和部门编号,还有一个部门表,其中列出了位置和部门编号。

这是我尝试过的:

SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS, EMPLOYEES
WHERE Employees.DeptNo IN (10, 30)
Order BY Location ASC;

结果很糟糕,例如,当我输入的数据没有反映这一点时,它会列出多个城市的员工。

4

4 回答 4

1

问题是您正在生成笛卡尔积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;
于 2012-11-19T21:41:58.387 回答
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;
于 2012-11-19T21:41:58.463 回答
0

您没有将表与主要外来连接,因此您得到了笛卡尔结果:

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;
于 2012-11-19T21:42:58.613 回答
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)

看看还是没有加入!(并不真地)

http://sqlfiddle.com/#!2/5e266/7

于 2012-11-19T21:44:26.597 回答