2012-11-19 36 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 –