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

SQL:从多个表中选择并排序,sql,Sql,在过去的一个小时里,我一直在想办法解决这个问题 我需要了解哪些员工在第10部门和第30部门工作,以及他们工作的地点。有一个列出员工姓名和部门号的员工表,还有一个是位置和部门号的部门表 以下是我尝试过的: SELECT Departments.Location, Departments.DeptNo, Employees.Ename FROM DEPARTMENTS, EMPLOYEES WHERE Employees.DeptNo IN (10, 30) Order BY Location AS

在过去的一个小时里,我一直在想办法解决这个问题

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

以下是我尝试过的:

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

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

问题是您正在生成一个。现有查询在两个表之间没有任何联接条件。您需要加入表:

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;
如果您需要帮助学习连接语法,这里是一个很好的方法

内部联接结果:

| LOCATION | DEPTNO | ENAME |
-----------------------------
|     Loc2 |     10 |  emp2 |
|     Loc2 |     10 |  emp3 |
|     Loc3 |     30 |  emp6 |
|     Loc3 |     30 |  emp4 |
|     Loc3 |     30 |  emp5 |
未使用联接语法的笛卡尔查询将产生如下结果,请参见:

如果要在连接之间使用逗号,则必须在WHERE子句中包含连接条件,这将产生与内部连接版本相同的结果:

试试这个:

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;

您没有将表与主外部对象联接,因此得到了笛卡尔结果:

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;

现在有点无意义,但评论很有趣:

原始要求

Select
  Count(*)
From
  Employees e
Where
  e.DeptNo In (10, 30)
Select
  *
From
  Employees e
Where
  e.DeptNo In (10, 30)
明确要求

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)
看,还是没有加入!不是真的


首先,你需要谷歌加入,看看如何停止扭曲。然后你需要通过Google Group By来学习如何将数字相加。也许我有点困惑,根据OP,employee表已经有了部门号,那么为什么需要加入?@SajjanSarkar两个表之间可能有一个类似的列,但是如果你不加入它们,然后将每个表的行与行相乘,这将使结果产生偏差。这是正确的。我尝试的原始查询返回了36个值。当我修改查询以包含join时,它返回了正确的结果。谢谢。@SajjanSarkar使用联接和逗号分隔的表列表(不带联接条件)查看我对结果差异的编辑。这不起作用,因为它将给出部门10,30的总数。。不是每一个的计数one@SajjanSarkar英语不是那么精确。我需要知道第10部门和第30部门总共有多少员工,或者分别有多少员工。我选了最容易的。这甚至可能意味着员工可以在多个部门工作,你想知道10个和30个部门有多少人。很公平,事实上,现在uve让我对OP想要什么感到困惑。我道歉,应该是这样的:我需要知道哪些员工在部门10和30工作。这不起作用,因为他们需要存储在部门表中的位置。