我有一些主要的测试。这些主要测试中的每一个都包含其他测试。这些测试中的每一个都包含其他测试等。以树木为例。
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
符号:
在每个主要测试中,测试的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从输入表传递,则所有子节点(和后代)将被设置/切换为在可能的情况下从父节点传递到叶子:子节点(和后代)可能只能切换到如果他们认为是待定的则通过。如果一个孩子(或后代)表示失败,则无法切换为通过(保持失败)。此外,如果一个孩子(或后代)已经表示已经通过,则没有必要再次转换为通过,它将被保留。
因此考虑到上述功能和表格内容,我想获得下面的结果表,只有我们试图切换到传递(成功与否),切换为传递或维持失败或传递的测试,包括输入表中指出的那些:
(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')