使用带有模糊连接的查找表的递归视图

时间:2018-06-05 14:45:24

标签: sql sql-server tsql sql-server-2012

我甚至不知道如何标题这个问题,但我希望这是有道理的。

我有三张桌子:

  1. 用户及其详细信息的表格
  2. 群组及其详细信息
  3. 具有其成员的查找ID的组的表,这些成员来自用户或组表
  4. 第3个表有两列:

    1. 与组(第2个)表中的行匹配的组ID
    2. 用户(第1个)或第(1)个表
    3. 中的行匹配的成员ID

      注意:

      • 用户和组表的ID彼此唯一。例如,如果用户的ID = 1,那么其他任何用户或任何组都不会拥有相同的ID。
      • 一个组可以有一个用户或另一个组作为成员。

      我需要转储第3个表的视图,完全展开每个组的所有成员,包括嵌套组,转储组路径,以及处理无限循环。希望这个例子清楚地表明:

      1。用户

      | ID | user_name |
      |----|-----------|
      |  1 | one       |
      |  2 | two       |
      |  3 | three     |
      |  4 | four      |
      |  5 | five      |
      

      2。基

      | ID | group_name |
      |----|------------|
      |  6 | six        |
      |  7 | seven      |
      |  8 | eight      |
      |  9 | nine       |
      | 10 | ten        |
      

      3。小组成员

      | group_ID | member_ID |
      |----------|-----------|
      |        6 |         1 |
      |        6 |         2 |
      |        6 |         3 |
      |        7 |         4 |
      |        7 |         5 |
      |        8 |         1 |
      |        8 |         9 |
      |        8 |        10 |
      |        9 |         5 |
      |       10 |         1 |
      |       10 |         8 |
      

      4。输出/结果

      | group_ID | user_ID | user_name   | group_path
      |----------|---------|-------------|------------
      |        6 |       1 | one         | six
      |        6 |       2 | two         | six
      |        6 |       3 | three       | six
      |        7 |       4 | four        | seven
      |        7 |       5 | five        | seven
      |        8 |       1 | one         | eight
      |        8 |       5 | five        | eight > nine
      |        8 |       1 | one         | eight > ten
      |        8 |         | [recursive] | eight > ten > eight
      |        9 |       5 | five        | nine
      |       10 |       1 | one         | ten
      |       10 |       1 | one         | ten > eight
      |       10 |       5 | five        | ten > eight > nine
      |       10 |         | [recursive] | ten > eight > ten
      

1 个答案:

答案 0 :(得分:3)

以下是答案, live demo

Instant