Учитывая следующие таблицы / отношения
![enter image description here](https://i.stack.imgur.com/YvZmB.png)
РЕДАКТИРОВАТЬ: Что, если заполнено с использованием SQL ниже, должно вернуть это ....
![enter image description here](https://i.stack.imgur.com/z1XxL.png)
SELECT TOP (100) PERCENT dbo.Task.Name AS Expr1, dbo.Role.Name FROM dbo.Role INNER JOIN dbo.RoleTask ON dbo.Role.Id = dbo.RoleTask.RoleId INNER JOIN dbo.Task ON dbo.RoleTask.TaskId = dbo.Task.Id ORDER BY dbo.Task.Name, dbo.Role.Name
Цель
Я пытаюсь заполнить RoleGroup (ту, которая просто висит там!) С определенными группами ролейблагодаря связи «многие ко многим» между ролью и заданием, признавая, что некоторые из них уже могут быть в таблице RoleGroup.
РЕДАКТИРОВАТЬ: Итак, учитывая приведенные выше результаты примера, это то, что мне нужночтобы увидеть в RoleGroup (я изменил это с оригинального поста, чтобы, надеюсь, прояснить, что я пытаюсь достичь) ...
GroupId RoleId
1 Plumber
2 Gardener
2 Topiary Guru
3 Electrician
4 Cleaner
4 Housekeeping Supervisor
4 Toilet Cleaning Specialist
5 Housekeeping Supervisor
Объяснение результатов
В связи с тем, что роли были связаны с определенными задачами, можно определить группы ролей.
В моем примере «Уборщик, супервайзер и специалист по уборке туалетов» были связаны с заданиями «Уборка туалетов».Поэтому я могу сказать, что это группа, и я хотел бы извлечь эту информацию.
Аналогичным образом, «Домашний руководитель» был связан с задачами «Инспекция туалета»;и никаких других ролей не имеет.Это означает, что должна быть извлечена другая новая группа (2 - Housekeeping Supervisor).
Если бы «Housekeeping Supervisor» был связан с другой задачей, а других ролей не было, мне не нужно было бы создавать другую группу, так каконо уже было распознано.
О, я пытаюсь добиться этого с помощью SQL в SQL Server 2008.
Любые советы или подсказки приветствуются.
SQL
USE TestDatabase
GO
CREATE TABLE [dbo].[Task](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Type] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Department](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[RoleGroup](
[Id] [int] NOT NULL,
[RoleId] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Role](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[DepartmentId] [int] NOT NULL,
CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[RoleTask](
[RoleId] [int] NOT NULL,
[TaskId] [int] NOT NULL,
CONSTRAINT [PK_RoleTask] PRIMARY KEY CLUSTERED
(
[RoleId] ASC,
[TaskId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_Role_Department] Script Date: 05/20/2011 17:56:49 ******/
ALTER TABLE [dbo].[Role] WITH CHECK ADD CONSTRAINT [FK_Role_Department] FOREIGN KEY([DepartmentId])
REFERENCES [dbo].[Department] ([Id])
GO
ALTER TABLE [dbo].[Role] CHECK CONSTRAINT [FK_Role_Department]
GO
/****** Object: ForeignKey [FK_RoleTask_Role] Script Date: 05/20/2011 17:56:49 ******/
ALTER TABLE [dbo].[RoleTask] WITH CHECK ADD CONSTRAINT [FK_RoleTask_Role] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Role] ([Id])
GO
ALTER TABLE [dbo].[RoleTask] CHECK CONSTRAINT [FK_RoleTask_Role]
GO
/****** Object: ForeignKey [FK_RoleTask_Task] Script Date: 05/20/2011 17:56:49 ******/
ALTER TABLE [dbo].[RoleTask] WITH CHECK ADD CONSTRAINT [FK_RoleTask_Task] FOREIGN KEY([TaskId])
REFERENCES [dbo].[Task] ([Id])
GO
ALTER TABLE [dbo].[RoleTask] CHECK CONSTRAINT [FK_RoleTask_Task]
GO
/** DATA **/
INSERT INTO [Department] ([Id], [Name]) VALUES (1, 'Housekeeping');
INSERT INTO [Department] ([Id], [Name]) VALUES (2, 'Security');
INSERT INTO [Department] ([Id], [Name]) VALUES (3, 'External Maintenance');
INSERT INTO [Department] ([Id], [Name]) VALUES (4, 'Internal Maintenance');
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (1, 'Cleaner', 1);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (2, 'Housekeeping Supervisor', 1);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (3, 'Toilet Cleaning Specialist', 1);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (4, 'Security Guard', 2);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (5, 'Electrician', 4);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (6, 'Plumber', 4);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (7, 'Gardener', 3);
INSERT INTO [Role] ([Id], [Name], [DepartmentId]) VALUES (8, 'Topiary Guru', 3);
INSERT INTO [Task] ([Id], [Name]) VALUES (1, 'Toilet Clean');
INSERT INTO [Task] ([Id], [Name]) VALUES (2, 'Light Out');
INSERT INTO [Task] ([Id], [Name]) VALUES (3, 'Blocked Sink');
INSERT INTO [Task] ([Id], [Name]) VALUES (4, 'Toilet Inspection');
INSERT INTO [Task] ([Id], [Name]) VALUES (5, 'Leaky Tap');
INSERT INTO [Task] ([Id], [Name]) VALUES (6, 'Bush too bushy');
INSERT INTO [Task] ([Id], [Name]) VALUES (7, 'Mop Floor');
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (1, 1);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (2, 1);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (3, 1);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (5, 2);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (6, 3);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (2, 4);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (6, 5);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (7, 6);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (8, 6);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (1, 7);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (2, 7);
INSERT INTO [RoleTask] ([RoleId], [TaskId]) VALUES (3, 7);