SQL:从多个表中选择并进行排序

时间:2012-11-19 21:39:44

标签: sql

我一直在努力寻找最后一小时。

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

这是我试过的:

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

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

4 个答案:

答案 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

请参阅SQL Fiddle with Demo

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)

看起来仍然没有加入! (不是真的)

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