2014-10-10 142 views
-1

這是我遇到的問題。構建sql查詢以從數據庫檢索特定數據

我有我正在試圖爲程序構建的查詢。以下是查詢:

  • 我需要在其部門控制的恰好一個項目上工作的員工的姓名。 (他們工作的非部門項目的數量並不重要,爲了說明一個員工是否在自己的部門工作了一個以上的項目,我不想要這個結果,但他可以在他的部門工作1個項目,其他部門。我只想找誰正在研究僅1中來自該項目分配給部門項目的員工。)
  • 此外,我需要證明的部門名稱,項目名稱和位置。
  • 我想以升序字母順序顯示結果(按姓氏和名字),以便於閱讀。

這裏是我的表

  • employee表:FNAME,LNAME,SSN,出生日期,地址,DNO(部門編號)
  • project表:項目名稱,projectnumber,plocation,dnum(部門號)
  • works_on表:SSN,projectnumber,hours_worked
  • department表:DNAME,dnumber,managerssn,manager_start_date

以下是我對這個工作小時後想出了:

select distinct 
    employee.fname, 
    employee.lname, 
    employee.ssn, 
    employee.dno, 
    project.pnumber, 
    project.dnum 
from 
    employee, works_on, project 
where 
    employee.dno = project.dnum 
    and project.pnumber = works_on.pno; 
+0

**絕對**告訴我們你做了什麼!不要擔心它不起作用 – 2014-10-10 21:47:12

+0

告訴我們你有什麼 – 2014-10-10 21:48:31

+0

^[踢壞的習慣:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08 /bad-habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表被替換爲ANSI中的* proper * ANSI'JOIN'語法* * 92 ** SQL標準(**超過20年**前),其使用不鼓勵 – 2014-10-11 07:49:57

回答

0

這樣的事情?

select e.fname, e.lname, e.dno, p.projectname 
from employees e 
inner join projects p on p.projectnumber = e.project --OR HOWEVER THE 2 ARE LINKED 
group by e.fname, e.lname, e.dno, p.projectname 
having count(p.Projectnumber) = 1 
order by e.lname asc 
0
SELECT 
    e.ssn as employee_ssn 
    ,e.dno as employee_department_number 
    ,wo.projectnumber 
    ,p.projectname as project_name 
    ,p.dnum as project_department_number 
FROM employees e 
JOIN works_on wo on wo.ssn = e.ssn 
JOIN projects p on p.projectnumber = wo.projectnumber 
WHERE e.dno = p.dnum 
0
SELECT 
     e.fname 
    , e.lname 
FROM works_on w 
     INNER JOIN employee e 
        ON w.ssn = e.ssn 
     INNER JOIN project 
        ON w.projectnumber = p.projectnumber 
         AND e.dno = p.dnum 
GROUP BY 
     e.fname 
    , e.lname 
HAVING COUNT(w.projectnumber) = 1 

「在由他們的部門控制的恰好一個項目」

  • 正好一個項目可以由具有 COUNT(w.projectnumber)= 1
  • 來確定
  • 控制其部門是加入條件e.dno到p.dnum
+0

嘿非常感謝所有人的幫助。嘿,你們怎麼知道所有這些東西?有沒有我可以閱讀的書或者我可以練習學習這些東西的教程?這些看起來非常複雜的查詢。我剛剛開始sql。我花了幾個小時工作,你們在幾分鐘內完成了。 – ramon 2014-10-10 22:17:54

+0

書籍仍然是最好的方式。試試這個:: Microsoft SQL Server 2012 T-SQL基礎知識(開發人員參考)Itzik Ben-Gan(作者)在線有堆也嘗試http://sqlzoo.net – 2014-10-10 23:10:40

0

所以我們需要做跨員工,項目和works_on聯接。我們可以忽略部門,因爲這不重要。下面是我認爲會工作的查詢:

select fname, lname, dno, projectname, count(*) as project_count 
from employee, project, works_on 
where employee.ssn = works_on.ssn and 
     works_on.projectnumber = project.projectnumber 
     project.dnum = employee.dno 
having project_count = 1 
  • 在選擇,我們做了COUNT(*)作爲project_count所以我們可以指望他們是如何 很多項目工作。
  • 在其中,我們將 與連接的行匹配在一起。
  • 其中第3行確保我們只有 才能獲得由其部門控制的項目。
  • 具有 子句是允許我們使用聚合函數指定 條件的一個非常重要的部分:此例中的count(*)project_count,在 中。

根據您使用的SQL引擎的不同,HAVING子句的語法可能略有不同。

0

不確定您是否需要GROUP BY,取決於您「完全是一個項目」的含義。這應該是非常接近:

select e.fname, e.lname, p.projectname, p.location, d.dname FROM 
employee e 
INNER JOIN works_on w 
ON e.ssn = w.ssn 
INNER JOIN project p 
ON w.projectnumber = p.projectnumber 
INNER JOIN department d 
ON p.dnum = d.dnumber 
WHERE e.dno = p.dnum 
ORDER BY e.lname, e.fname