递归CTE - 更新SQL Server中的节点

时间:2017-01-27 23:39:11

标签: sql-server sql-server-2008 recursion sql-server-2008-r2 common-table-expression

我有一些主要的测试。这些主要测试中的每一个都包含其他测试。这些测试中的每一个都包含其他测试等。以树木为例。

                 Main Test 1
                     ID:1
                  /    |    \
                 /     |     \
                +      o      +               
              Test   Test   Test 
              ID:2   ID:3   ID:4
             /    \          / \
            /      \        /   \
           +        o      +     o
         Test     Test   Test   Test
         ID:5     ID:6   ID:7   ID:8
          |             /    \
          |            /      \
          o           o        o
         Test       Test      Test
         ID:12      ID:9      ID:10


                 Main Test 2
                     ID:2
                  /        \
                 /          \
                +            +               
              Test         Test 
              ID:3         ID:8
            /   |   \          
           /    |    \        
          o     o     o      
       Test   Test    Test   
       ID:5   ID:10   ID:7   

符号:

  • 'o'是叶子
  • '+'是父母
  • 主要测试1和主要测试2是主要测试(根测试)。

在每个主要测试中,测试的ID是唯一的,但主测试中的ID测试可以在上面的树显示的其他主要测试中重复。

我有一个输入表,比方说,“INPUT”,下面是列:

ID_MainTest | ID_TEST | PASSED

使用此输入表,我们指出了每个主要测试的哪些测试通过。

我们还有另一个表,其中包含上面的树表示到表中,假设表格为“Trees”:

ID_MainTest | ID_TEST | PARENT_ID_TEST

最后我们有另一个表,比如表“TESTS”,其中包含表示每个测试的当前结果(PENDING,FAILED,PASSED)的所有测试:

ID_MainTest | ID_TEST | RESULT

假设表格内容为:

INPUT表(ID_MainTest和ID_Test是主键):

ID_MainTest | ID_TEST | PASSED
     1          4         1
     1          5         1
     1          6         1
     1          2         1
     1          3         1
     2          3         1

TREES表(ID_MainTest和ID_Test是主键):

ID_MainTest | ID_TEST | PARENT_ID_TEST
     1          2           NULL
     1          3           NULL
     1          4           NULL
     1          5            2
     1          6            2
     1          7            4
     1          8            4
     1         12            5
     1          9            7
     1         10            7
     2          3            NULL
     2          8            NULL
     2          5            3
     2         10            3
     2          7            3

TESTS表(ID_MainTest和ID_Test是主键):

 ID_MainTest | ID_TEST |   RESULT
     1          2           PENDING
     1          3           FAILED
     1          4           FAILED
     1          5           PASSED
     1          6           PENDING
     1          7           PASSED
     1          8           FAILED
     1         12           PASSED
     1          9           PASSED
     1         10           PENDING
     2          3           PENDING
     2          8           FAILED
     2          5           PASSED
     2         10           PENDING
     2          7           PENDING

功能如下:

  • 当且仅当其所有子项都显示为已通过时,测试(输入表中指示的那些)将切换为传递。如果它的任何子节点(或后代)失败,那么尽管在输入表中指示为父节点,但父节点将被设置/切换为失败。

  • 如果指示test从输入表传递,则所有子节点(和后代)将被设置/切换为在可能的情况下从父节点传递到叶子:子节点(和后代)可能只能切换到如果他们认为是待定的则通过。如果一个孩子(或后代)表示失败,则无法切换为通过(保持失败)。此外,如果一个孩子(或后代)已经表示已经通过,则没有必要再次转换为通过,它将被保留。

  • 父表示在输入表中传递,可以切换到传递if 它的所有后代都是通过的(如果这个父母是独立的 在测试表中数字为失败或待定,这是一个 除外)。

因此考虑到上述功能和表格内容,我想获得下面的结果表,只有我们试图切换到传递(成功与否),切换为传递或维持失败或传递的测试,包括输入表中指出的那些:

(ID_MainTest和ID_Test是主键):

 ID_MainTest | ID_TEST |   RESULT
     1          2           PASSED
     1          3           PASSED
     1          4           FAILED
     1          5           PASSED
     1          6           PASSED
     1          7           PASSED
     1          8           FAILED
     1         12           PASSED
     1          9           PASSED
     1         10           PASSED
     2          3           PASSED
     2          5           PASSED
     2         10           PASSED
     2          7           PASSED

我提供下面的初始表格:

DECLARE @INPUT AS TABLE
(
    ID_MainTest int,
    ID_TEST  int,
    PASSED bit
)


INSERT INTO @INPUT VALUES
(1, 4, 1),
(1, 5, 1),
(1, 6, 1),
(1, 2, 1),
(1, 3, 1),
(2, 3, 1)

DECLARE @TREES AS TABLE
(
    ID_MainTest int,
    ID_TEST  int,
    PARENT_ID_TEST int
)


INSERT INTO @TREES VALUES
(1, 2, NULL),
(1, 3, NULL),
(1, 4, NULL),
(1, 5, 2),
(1, 6, 2),
(1, 7, 4),
(1, 8, 4),
(1, 12, 5),
(1, 9, 7),
(1, 10, 7),
(2, 3, NULL),
(2, 8, NULL),
(2, 5, 3),
(2, 10, 3),
(2, 7, 3)

DECLARE @TESTS AS TABLE
(
    ID_MainTest int,
    ID_TEST  int,
    RESULT NVARCHAR(50)
)


INSERT INTO @TESTS VALUES
(1, 2, 'PENDING'),
(1, 3, 'FAILED'),
(1, 4, 'FAILED'),
(1, 5, 'PASSED'),
(1, 6, 'PENDING'),
(1, 7, 'PASSED'),
(1, 8, 'FAILED'),
(1, 12, 'PASSED'),
(1, 9, 'PASSED'),
(1, 10, 'PENDING'),
(2, 3, 'PENDING'),
(2, 8, 'FAILED'),
(2, 5, 'PASSED'),
(2, 10, 'PENDING'),
(2, 7, 'PENDING')

0 个答案:

没有答案