我有两个表:Trainings表和Training_Log表
Create Table Trainings
( Training_ID int
,Train_Title varchar(20)
)
Create Table Training_Log
( Log_ID int
, EmployeeName varchar(20)
, Training_ID int
, Training_Date date
)
> insert into Trainings values(1,'Sales Training')
insert into Trainings values(2,'Risk Management')
insert into Trainings values(3,'First Aid')
>
> insert into Training_Log values (1, 'Bob Marley', 2, '10/01/2005')
> insert into Training_Log values (2, 'Bob Marley', 3, '02/05/2006')
> insert into Training_Log values (3,'Ralph Kimball',1,'01/04/2004')
如果我想获得结果集,如何编写SQL:
EmployeeName Train_Title Train_Date
Bob Marley Sales Training Null
Bob Marley Risk Management 10/01/2005
Bob Marley First Aid 02/05/2006
Ralph Kimball Sales Training 01/04/2004
Ralph Kimball Risk Management Null
Ralph Kimball First Aid Null
答案 0 :(得分:1)
我同意Brian Driscol,你应该考虑为雇员创建一个表格。
无论如何,此查询返回您想要的内容:
WITH AllTrainingCombinations AS
(
SELECT DISTINCT EmployeeName, Train_Title, Trainings.Training_ID
FROM Training_Log
CROSS JOIN Trainings
)
SELECT A.EmployeeName, A.Train_Title, T.Training_Date
FROM AllTrainingCombinations AS A
LEFT JOIN Training_Log AS T ON A.EmployeeName = T.EmployeeName
AND A.Training_ID = T.Training_ID
Bob Marley First Aid 2006-02-05
Bob Marley Risk Management 2005-10-01
Bob Marley Sales Training NULL
Ralph Kimball First Aid NULL
Ralph Kimball Risk Management NULL
Ralph Kimball Sales Training 2004-01-04
答案 1 :(得分:0)
这样可行,但找不到至少一个培训日志的员工。
select e.EmployeeName, t.Train_Title, tl.Train_Date
from
Trainings t cross join
(select distinct EmployeeName from Training_Log) e
left outer join
Training_Log tl
on tl.Training_ID = t.Training_ID and tl.EmployeeName = e.EmployeeName
order by e.EmployeeName, t.Training_ID
这与里卡多的回答几乎完全相同。