SQL服务器匹配列上的两个表

HSh*_*rma 4 sql sql-server select join

我有两个表,一个存储用户技能,另一个存储工作所需的技能.我想匹配每个用户与工作匹配的技能数量.表结构是

Table1: User_Skills
| ID | User_ID | Skill    |
---------------------------
| 1  |  1      |  .Net    |
---------------------------
| 2  |  1      |  Software|
---------------------------
| 3  |  1      |  Engineer|
---------------------------
| 4  |  2      |  .Net    |
---------------------------
| 5  |  2      |  Software|
---------------------------

Table2: Job_Skills_Requirement
| ID | Job_ID | Skill     |
--------------------------
| 1  |  1      |  .Net    |
---------------------------
| 2  |  1      |  Engineer|
---------------------------
| 3  |  1      |  HTML    |
---------------------------
| 4  |  2      |  Software|
---------------------------
| 5  |  2      |  HTML    |
---------------------------
Run Code Online (Sandbox Code Playgroud)

我试图用逗号分隔技能并进行比较,但这些可以按不同的顺序排列.

编辑 这里的所有答案都很棒.我正在寻找的结果是将所有作业与所有用户匹配,稍后我将匹配其他属性.

Mur*_*nik 6

您可以按skill列加入表并计算匹配项:

SELECT   user_id, job_id, COUNT(*) AS matching_skills
FROM     user_skills u
JOIN     job_skills_requirement j ON u.skill = j.skill
GROUP BY user_id, job_id
Run Code Online (Sandbox Code Playgroud)

编辑:
如果您还想显示没有匹配技能的用户和工作,您可以使用full outer join.

SELECT          user_id, job_id, COUNT(*) AS matching_skills
FROM            user_skills u
FULL OUTER JOIN job_skills_requirement j ON u.skill = j.skill
GROUP BY        user_id, job_id
Run Code Online (Sandbox Code Playgroud)

编辑2:
正如Jiri Tousek评论的那样,上述查询将生成null用户和作业之间不匹配的s.如果你想在它们之间使用完整的笛卡尔产品,你可以使用(滥用?)cross join语法并计算每个用户和每个工作之间实际匹配的技能数量:

SELECT     user_id, 
           job_id,
           COUNT(CASE WHEN u.skill = j.skill THEN 1 END) AS matching_skills
FROM       user_skills u
CROSS JOIN job_skills_requirement j
GROUP BY   user_id, job_id
Run Code Online (Sandbox Code Playgroud)