SQL:如何实现泛型类别?

时间:2011-03-17 07:21:20

标签: sql database sql-server-2008 database-design select

我需要在SQL中实现以下分类:

  • 组可以包含多个测试或多个(子)组
  • 测试可以分为多组
  • (子)组可以在多个(父)组中

......这意味着2 x M:N关系。下表可以存储组树:

TEST_TABLE
test_id(pk),test_name

GROUP_TABLE
group_id(pk),group_name

TEST_IN_GROUP_TABLE
test_id(fk),group_id(fk)

GROUP_RELATIONS_TABLE
parent_group_id(fk),child_group_id(fk)

可是:

  • 如何列出群组中的所有测试?这听起来很难,因为群组可能包含测试或子群与其他测试。
  • 或者如何修改表以使SELECT成为可能?我可以在GROUP_TABLE中创建其他 child_count 列。它将由触发器自动填充。但即便如此,这对我来说也很难。

1 个答案:

答案 0 :(得分:1)

使用公用表表达式首先构建所搜索组的group_id,然后使用该单个组列表,通过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