SQL Server matching all rows from Table1 with all rows from Table2 -
someone please me query, have 2 tables
employee
employeeid languageid 1 1 1 2 1 3 2 1 2 3 3 1 3 2 4 1 4 2 4 3
task
taskid languageid langaugerequired 1 1 1 1 2 0 2 1 1 2 2 1 2 3 1 3 2 0 3 3 1
langaugeid connected table langauge (this table explaination only)
langaugeid languagename 1 english 2 french 3 italian
is there possilbe way make query gets employees can speak languages required each task?
for example:
- task id 1 requires languageid = 1, result should employeeid 1,2,3,4
- task id 2 requires 3 languages, result should employeeid 1,4
- task id 3 requires languageid = 3, result should employeeid 1,2,4
here variant this:
select t1.taskid, t2.employeeid ( select a.taskid, count(distinct a.languageid) lang_cnt task a.langaugerequired=1 group a.taskid ) t1 left outer join ( select a.taskid, b.employeeid, count(distinct b.languageid) lang_cnt task inner join employee b on (a.langaugerequired=1 , a.languageid=b.languageid) group a.taskid, b.employeeid ) t2 on (t1.taskid=t2.taskid , t1.lang_cnt=t2.lang_cnt) ### here can insert statement, like: t1.taskid=1 , t2.employeeid=1 if such query returns row - employee can work task, if no rows - no ### order t1.taskid, t2.employeeid
as see, query creates 2 temporary tables , joins them.
first table (t1) calculates how many languages required each task
second table (t2) finds employees has @ least 1 language required task, groups task/employee find how many languages can taken employee
the main query performs left join, there can situations when no employees can perform task
here output:
task employee 1 1 1 2 1 3 1 4 2 1 2 4 3 1 3 2 3 4
update: simpler, less correct variant, because not return tasks without possible employees
select a.taskid, b.employeeid, count(distinct b.languageid) lang_cnt task inner join employee b on (a.langaugerequired=1 , a.languageid=b.languageid) group a.taskid, b.employeeid having count(distinct b.languageid) = (select count(distinct c.languageid) task c c.langaugerequired=1 , c.taskid=a.taskid)
Comments
Post a Comment