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:

  1. task id 1 requires languageid = 1, result should employeeid 1,2,3,4
  2. task id 2 requires 3 languages, result should employeeid 1,4
  3. 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

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -