I have to check if the worker has all the necessary skills. This is done by comparing a set of working skills with a set of necessary skills. So, to make this clearer, here are the DDL tables that I have:
CREATE TABLE [WorkerSkills](
[WorkerId] [bigint] NOT NULL,
[SkillName] [varchar](100) NOT NULL
) GO
CREATE TABLE [SkillCombinator](
[SetId] [int] NOT NULL,
[SkillCombinator] [varchar](5) NOT NULL
) GO
CREATE TABLE [RequiredSkills](
[SetId] [int] NOT NULL,
[SkillName] [varchar](100) NOT NULL
) GO
and here is an example of data:
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (1, 'A')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (1, 'B')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (1, 'C')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (2, 'D')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (2, 'X')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (3, 'E')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (4, 'A')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (4, 'B')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (4, 'H')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (4, 'I')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'A')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'B')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'C')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'E')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'G')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'H')
INSERT [WorkerSkills] ([WorkerId], [SkillName]) VALUES (5, 'I')
INSERT [SkillCombinator] ([SetId], [SkillCombinator]) VALUES (1, 'AND')
INSERT [SkillCombinator] ([SetId], [SkillCombinator]) VALUES (2, 'OR')
INSERT [SkillCombinator] ([SetId], [SkillCombinator]) VALUES (3, 'AND')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (1, 'A')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (1, 'B')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (1, 'C')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (2, 'D')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (2, 'E')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (2, 'F')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (3, 'G')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (3, 'H')
INSERT [RequiredSkills] ([SetId], [SkillName]) VALUES (3, 'I')
This means that there are 3 sets, each of which has 3 specific skills.
set 1: A and B and C
set 2: D or E or F
set 3: G and H and I
And there are workers with the following skills:
worker 1: A, B, C
worker 2: D, X
worker 3: E
worker 4: A, B, H, I
worker 5: A, B, C, E, G, H, I
Now the problem is to write a function in Sql Server 2008 that accepts the WorkerId and SetCombinator parameters and returns a value indicating whether Worker has all the necessary skills.
Input Example 1:
WorkerId: 1
SetCombinator: OR
This means that all sets must have a combinator OR , i.e.:
set 1: A and B and C
OR
set 2: D or E or F
OR
set 3: G and H and I
true, , # 1.
2:
WorkerId: 4
SetCombinator: OR
false.
3:
WorkerId: 1
SetCombinator: AND
, , :
set 1: A and B and C
AND
set 2: D or E or F
AND
set 3: G and H and I
false, , # 1, 2- 3- .
4:
WorkerId: 5
SetCombinator: AND
true, , .
, ?
: , RequiredSkills , , . , .