2012-04-27 2 views
0

У меня есть одна таблица (SeekerInfo), что нравится:Выбор данных из двух таблиц SQL

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

и другой таблицы (SeekerCources), что нравится (каждый максимальный искатель есть 3 КУРСЫ):

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

Я хочу сделать оператор выбора, который показывает данные из двух таблиц:

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' –

ответ

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);

Это будет возвращать все курсы с дополнительной информацией искателя;)

EDIT: К сожалению, я не правильно прочитал ваш пост - вы всегда будете иметь максимум 3 курсов. Тем не менее, может быть, это помогает в любом случае

Смежные вопросы