2009-12-01 147 views
1

我有兩個表:SELECT語句

EMP

emp_id | Name | Surname | 
1  | Bob | Park | 
2  | Annie| South | 
3  | Eric | P.  | 

項目

proj_id | Tester_1 | Tester_2 | Tester_3 | 
1  |  2 | 3  | 1  | 

現在我想做一個觀點,讓我有以下

proj_id | Tester_1_Name | Tester_2_Name |  Tester_3_Name 
1  |  Annie  |  Eric  |   Bob 
+1

關於什麼的任何想法?這裏沒有真正的問題。你有什麼麻煩? – Jimmeh 2009-12-01 14:43:16

+0

EMP-PROJECT關係表或FOREIGN鍵在哪裏? – 2009-12-01 14:44:51

回答

9

您只需要加入

Select proj_id, 
     t1.name + ' ' + t1.surname tester1, 
     t2.name + ' ' + t2.surname tester2, 
     t3.name + ' ' + t3.surname tester3 
    From Project p 
    Left Join Emp t1 On t1.emp_id = p.Tester_1 
    Left Join Emp t2 On t2.emp_id = p.Tester_2 
    Left Join Emp t2 On t3.emp_id = p.Tester_3 

作爲視圖...

Create View ProjectWithTesters 
    As 
     Select proj_id, 
      t1.name + ' ' + t1.surname tester1, 
      t2.name + ' ' + t2.surname tester2, 
      t3.name + ' ' + t3.surname tester3 
     From Project p 
     Left Join Emp t1 On t1.emp_id = p.Tester_1 
     Left Join Emp t2 On t2.emp_id = p.Tester_2 
     Left Join Emp t2 On t3.emp_id = p.Tester_3 

注:正如其他人所提到的,你的數據庫的設計違反了第一範式「不應該有重複的組」,這意味着表不應該包含多個表示某個屬性的多個實例的列(如您的tester_1,tester_2,tester_3)。看看這個鏈接:database normalization瞭解更多信息。

+0

+1,你很清楚,先生 – 2009-12-01 14:54:06

+0

irenic:「促進或適合促進和平;和解;安寧;和平;太平洋」。那麼,好吧,我不確定我的帖子怎麼樣,但是,謝謝!恭維,以及今天我添加到我的詞彙中的新單詞! – 2009-12-01 15:07:26

0

SELECT proj_id, t1.Name, t2.Name, t3.Name FROM PROJECT INNER JOIN EMP as t1 ON PROJECT.Tester_1 = t1.emp_id INNER JOIN EMP as t2 ON PROJECT.Tester_2 = t2.emp_id INNER JOIN EMP as t3 ON PROJECT.Tester_3 = t3.emp_id

+1

INNER JOINs將使一個項目只有兩個測試員沒有出現。可能不是一個好主意。 – 2009-12-01 14:45:55

7

你應該看看正常化您的數據庫。當你決定在一個項目中需要4個測試人員時會發生什麼?

這就是說,這應該給你你想要的。

SELECT 
    P.proj_id, 
    E1.name AS tester_1_name, 
    E2.name AS tester_2_name, 
    E3.name AS tester_3_name 
FROM 
    Project P 
LEFT OUTER JOIN Emp E1 ON 
    E1.emp_id = P.tester_1 
LEFT OUTER JOIN Emp E2 ON 
    E2.emp_id = P.tester_2 
LEFT OUTER JOIN Emp E3 ON 
    E3.emp_id = P.tester_3 
1

如果你設計的這些表,那麼你可能要查找「正常化」在谷歌,除非一個項目只能曾經有3個測試...

2

的解決方案是DBMS特定的。某些DBMS具有效用函數,可以幫助您在此處嘗試正交化。

查爾斯的解決方案是一個良好的開端:

Select proj_id, 
     t1.name + ' ' + t1.surname tester1, 
     t2.name + ' ' + t2.surname tester2, 
     t3.name + ' ' + t3.surname tester3 
    From Project p 
    Left Join Emp t1 On t1.emp_id = p.Tester_1 
    Left Join Emp t2 On t2.emp_id = p.Tester_2 
    Left Join Emp t2 On t3.emp_id = p.Tester_3 

爲正交其它方式被結合並分組,如果有較少的測試項目,這是非常有用的。