выборка модулей и прав на них MSSQL 2000

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Morfius
Сообщения: 47
Зарегистрирован: 23 янв 2005, 17:53

Есть две таблицы

таблица модулей:
cms_objects
---
id
name

таблица прав групп:
cms_groups_permissions
---
id
group_id
obj_id

нужно получить результат вида:
cms_objects.name|cms_groups_permissions.id|
используя условие WHERE (cms_groups_permissions.group_id = @group_id)
Часть результата — модули для которых у заданной группы не существует прав должна отображаться как: cms_objects.name|NULL|

Как должен вылядеть запрос?

SELECT cms_objects.name, cms_groups_permissions.id
FROM cms_objects LEFT JOIN cms_groups_permissions ON cms_objects.id = cms_groups_permissions.obj_id
WHERE cms_groups_permissions.group_id IS NULL OR cms_groups_permissions.group_id = @group_id

Для кажой группы этот запрос возвращает права не на все имеющиеся модули, а только на разрешённые группе и непринадлежащие ни к какой группе вообще (cms_groups_permissions.group_id IS NULL).
сейчас в таблице модулей:

id name
1 дерево сайта
2 новости
5 пользователи
11 группы
12 права групп

в таблице групп:
id name
1 менеджер
2 администратор
3 главный администратор
в таблице прав:

Код: Выделить всё

id group_id obj_id 
1      3           1
2      3           2
3      3           5
4      1           2
5      1           1
7      2           1 
8      2           2
9      2           5
10    3           12
при @group_id = 1 выдаётся:
дерево сайта| 5
новости | 4
группы | NULL
а должно быть:
дерево сайта| 5
новости | 4
пользователи| NULL
группы | NULL
права групп | NULL

Как сделать, чтобы выбирались и права, которые уже присоединены к другим группам?
Yurich
Сообщения: 107
Зарегистрирован: 23 фев 2004, 19:07

попробуй

Код: Выделить всё

SELECT cms_objects.name, cms_groups_permissions.id
FROM cms_objects LEFT JOIN cms_groups_permissions ON (cms_objects.id = cms_groups_permissions.obj_id AND cms_groups_permissions.group_id = @group_id)
Ответить