SQL:从多个表中选择并排序
在过去的一个小时里,我一直在想办法解决这个问题 我需要了解哪些员工在第10部门和第30部门工作,以及他们工作的地点。有一个列出员工姓名和部门号的员工表,还有一个是位置和部门号的部门表 以下是我尝试过的: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
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工作。这不起作用,因为他们需要存储在部门表中的位置。