SQL: как реализовать общие категории? - PullRequest
0 голосов
/ 17 марта 2011

Мне нужно реализовать следующую классификацию в SQL:

  • группа может содержать несколько тестов или несколько (дочерних) групп
  • тест может быть в нескольких группах
  • (дочерняя) группа может быть в нескольких (родительских) группах

... это означает 2 отношения M: N. Следующие таблицы могут хранить деревья групп:

test_table
test_id (pk), test_name

GROUP_TABLE
идентификатор_группы (pk), имя_группы

TEST_IN_GROUP_TABLE
test_id (fk), group_id (fk)

GROUP_RELATIONS_TABLE
parent_group_id (fk), child_group_id (fk)

Но:

  • Как составить список всех тестов в группе? Это звучит для меня невероятно сложно, поскольку группа может содержать тесты или подгруппы с другими тестами.
  • Или как изменить таблицы, чтобы сделать возможным такой SELECT? Я мог бы создать дополнительный столбец child_count в GROUP_TABLE. Он будет автоматически заполнен триггером. Но даже при этом это крепкий орешек для меня.

1 Ответ

1 голос
/ 17 марта 2011

Вы используете Common Table Expressions, чтобы сначала создать group_ids искомой группы, а затем, используя этот единственный список групп, присоединиться через TEST_IN_GROUP_TABLE к тестовой таблице для всех тестов.

;with cte as (
    select group_id
    from GROUP_TABLE
    where group_id = 1
    union all
    select child_group_id
    from GROUP_RELATIONS_TABLE
    inner join cte on cte.group_id = GROUP_RELATIONS_TABLE.parent_group_id
)
select t.*
from cte
inner join TEST_IN_GROUP_TABLE tg on tg.group_id = cte.group_id
inner join TEST_TABLE t on t.test_id = tg.test_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...