2012-04-27 172 views
0

我有一個表(SeekerInfo),像:選擇數據從兩個表的SQL

-------------------------------------------------- 
SeekerID - SeekerName - SeekerSex - SeekerMobile 
12121 - mmmm  - Male  - 067676767 
13223 - ssss  - Female - 078876767 
-------------------------------------------------- 

和另一個表(SeekerCources),像(每個求職者最多有3個cources):

-------------------------------------------------- 
SeekerID - CourceName - Duration 
12121 - MCSA  - 1 year 
12121 - MCPD  - 6 months 
13223 - CCNA  - 1 year 
13223 - CCNP  - 1 year 
13223 - MCTS  - 4 months 

我想讓兩個表中的預覽數據的select語句如下所示:

SeekerID - SeekerName - SeekerSex - SeekerMobile - Cource1 - Cource2 - Cource3 
12121 - mmmm  - Male  - 067676767 - MCSA - MCPD - *NULL* 
13223 - ssss  - Female - 078876767 - CCNA - CCNP - MCTS 
+3

你怎麼知道它的'CCNA - CCNP - MCTS'而不是'MCTS -CCNA - CCNP' – 2012-04-27 17:11:53

回答

0

在這裏你指定的方法數1-3到每個課程,然後做三加入

WITH cte 
    AS (SELECT Row_number() OVER (partition BY SeekerID ORDER BY CourceName) rn 
       , 
       SeekerID, 
       CourceName, 
       Duration 
     FROM SeekerCources) 
SELECT si.SeekerID, 
     si.SeekerName, 
     si.SeekerSex, 
     si.SeekerMobile, 
     c1.CourceName AS Cource1, 
     c2.CourceName AS Cource2, 
     c3.CourceName AS Cource3 
FROM SeekerInfo si 
     LEFT JOIN cte c1 
     ON si.SeekerID = c1.SeekerID 
      AND c1.rn = 1 
     LEFT JOIN cte c2 
     ON si.SeekerID = c2.SeekerID 
      AND c2.rn = 2 
     LEFT JOIN cte c3 
     ON si.SeekerID = c3.SeekerID 
      AND c3.rn = 3 

DEMO

一個未解決的問題是,我們沒有決定這當然進去1,2的好方法,或者3也許如果你有一個類似於日期的字段,那麼你可以用這個字段替換CourceName

eg
Row_number() OVER (partition BY SeekerID ORDER BY DateTaken)

0

看起來你會在很長一段時間內有很多NULL值,這意味着你遲早會遇到問題。 此外,您正試圖在結果中引入n個屬性,n是課程結果的最大數量,這不會讓客戶端變得更容易。

我可以建議一種不同的方法,您將所有結果作爲行,這意味着您的結果中將有重複的數據(這並不重要,但因爲您沒有存儲該數據)。 SELECT i。*,m.CourseName FROM SeekerInfo i JOIN SeekerCourses c ON(i.SeekerID = m.SeekerID);

這將返回所有課程與附加導引頭信息)

編輯:對不起,我沒有正確讀您的文章 - 你將永遠有一個最大的3個療程。儘管如此,也許這有幫助