2012-11-19 37 views
0

我一直试图在最后一小时弄清楚这一点。SQL:从多个表格中进行选择并订购

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

这里是我的尝试:

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

的结果是扭曲,在多个城市例如,它的员工名单时,我输入的数据没有反映这一点。

+1

首先,你需要谷歌'join'来看看如何停止screwyness。那么你需要Google'Group By'来学习如何合计数字。 – Laurence

+1

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) –

回答

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 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; 
+0

也许我有点困惑,根据OP,雇员表已经有部门没有。 ,那么为什么要加入? –

+0

@SajjanSarkar这两个表之间可能有一个类似的列,但是如果你不加入它们,那么你会逐行乘以每个表,这会使结果偏斜。 – Taryn

+0

这是对的。我尝试的原始查询返回了36个值。当我修改查询以包含连接时,它返回了正确的结果。谢谢。 – bbbbbbbbbb

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; 
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; 
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

+0

这不会工作,因为它会给部门总计10,30 ..不是每个COUNTS一个 –

+0

@SajjanSarkar英语并不那么确切。 “我需要多少员工在10和30部门工作”可能意味着总共或每个单独。我选择了最简单的。这甚至可能意味着员工可以在多个部门工作,并且您想知道10和30中有多少人。 – Laurence

+0

公平不够,实际上现在我很困惑我abt OP想要什么lol –