SQL:如何实现通用类别?

SQL:如何实现通用类别?,sql,database,sql-server-2008,database-design,select,Sql,Database,Sql Server 2008,Database Design,Select,我需要在SQL中实现以下分类: 组可以包含多个测试或多个(子)组 测试可以分为多个组 (子)组可以位于多个(父)组中 。。。这意味着2 x M:N关系。下表可以存储组树: 测试表 测试id(主键),测试名称 分组表 组id(主键),组名称 在组表中测试 测试id(fk)、组id(fk) 组关系表 父组id(fk)、子组id(fk) 但是: 如何在组中列出所有测试?这听起来非常困难,因为组中可能包含测试或带有其他测试的子组 或者如何修改表以使这种选择成为可能?我可以在GROUP\U表中创建额

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

  • 组可以包含多个测试或多个(子)组
  • 测试可以分为多个组
  • (子)组可以位于多个(父)组中
。。。这意味着2 x M:N关系。下表可以存储组树:

测试表
测试id(主键),测试名称

分组表
组id(主键),组名称

在组表中测试 测试id(fk)、组id(fk)

组关系表
父组id(fk)、子组id(fk)

但是:

  • 如何在组中列出所有测试?这听起来非常困难,因为组中可能包含测试或带有其他测试的子组
  • 或者如何修改表以使这种选择成为可能?我可以在GROUP\U表中创建额外的子\U计数列。它将由触发器自动填充。但即使这样,对我来说也很难

您使用公共表表达式首先构建所需组的组ID,然后使用单个组列表,通过组表中的测试连接到所有测试的测试表

;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

数据库可能位于MS SQL Server 2008 R2上。(我还在做逻辑模型,稍后我会做物理模型)。然后设计就好了。测试组和1-M:M-1桥接表是正确的,分层表组关系也是正确的。