【发布时间】:2016-08-23 08:09:03
【问题描述】:
我在 SQL Server 中有一个这样的进程表:
workflowXML 列的值如下:
sample1 (ProcessID=1)
sample1 的workflowXML:
<process>
<Event type="start" id="StartEvent_1" name="Start">
<outgoing>SequenceFlow_0z7u86p</outgoing>
<outgoing>SequenceFlow_1onkt3z</outgoing>
</Event>
<task type="" id="Task_0a7vu1x" name="D">
<incoming>SequenceFlow_108ajnm</incoming>
<incoming>SequenceFlow_1onkt3z</incoming>
<outgoing>SequenceFlow_01clcmz</outgoing>
</task>
<task type="goal" id="Task_00ijt4n" name="B">
<incoming>SequenceFlow_17q1ecq</incoming>
<incoming>SequenceFlow_0q9j3et</incoming>
<outgoing>SequenceFlow_1ygvv8b</outgoing>
<outgoing>SequenceFlow_02glv1g</outgoing>
</task>
<task type="" id="Task_1rnuz4y" name="A">
<incoming>SequenceFlow_1ygvv8b</incoming>
<incoming>SequenceFlow_0z7u86p</incoming>
<outgoing>SequenceFlow_108ajnm</outgoing>
<outgoing>SequenceFlow_17q1ecq</outgoing>
<outgoing>SequenceFlow_075iuj9</outgoing>
</task>
<task type="goal" id="Task_1d4ykor" name="E">
<incoming>SequenceFlow_01clcmz</incoming>
<incoming>SequenceFlow_075iuj9</incoming>
<incoming>SequenceFlow_1djp3tu</incoming>
<outgoing>SequenceFlow_0q9j3et</outgoing>
</task>
<task type="goal" id="Task_1sembw4" name="C">
<incoming>SequenceFlow_02glv1g</incoming>
<outgoing>SequenceFlow_1djp3tu</outgoing>
</task>
</process>
sample2 (ProcessID=2)
sample2 的workflowXML:
<process id="Process_1" isExecutable="false">
<Event type="start" id="StartEvent_0bivq0x" name="Start">
<outgoing>SequenceFlow_0q5ik20</outgoing>
<outgoing>SequenceFlow_147xk2x</outgoing>
</Event>
<task type="" id="Task_141buye" name="A">
<incoming>SequenceFlow_0q5ik20</incoming>
<incoming>SequenceFlow_0wg37hn</incoming>
<outgoing>SequenceFlow_1pvpyhe</outgoing>
<outgoing>SequenceFlow_10is4pe</outgoing>
</task>
<task type="" id="Task_1n3p00i" name="C">
<incoming>SequenceFlow_147xk2x</incoming>
<incoming>SequenceFlow_10is4pe</incoming>
<outgoing>SequenceFlow_18ks1jr</outgoing>
<outgoing>SequenceFlow_08gxini</outgoing>
</task>
<task type="goal" id="Task_0olxqpp" name="B">
<incoming>SequenceFlow_1pvpyhe</incoming>
<outgoing>SequenceFlow_03eekq0</outgoing>
</task>
<task type="goal" id="Task_0zjgfkf" name="D">
<incoming>SequenceFlow_18ks1jr</incoming>
<incoming>SequenceFlow_03eekq0</incoming>
<outgoing>SequenceFlow_0wg37hn</outgoing>
</task>
<task type="" id="Task_1q71efy" name="E">
<incoming>SequenceFlow_08gxini</incoming>
</task>
</process>
编辑1(添加样本3)
sample3 (ProcessID=3)
sample3 的workflowXML:
<process>
<Event type="start" id="StartEvent_1" name="Start">
<outgoing>SequenceFlow_01rkkhj</outgoing>
</Event>
<task type="" id="Task_1jixk79" name="A">
<incoming>SequenceFlow_01rkkhj</incoming>
<incoming>SequenceFlow_1tszkq8</incoming>
<outgoing>SequenceFlow_0v8wuqu</outgoing>
<outgoing>SequenceFlow_14u6fh7</outgoing>
<outgoing>SequenceFlow_1q4991g</outgoing>
</task>
<task type="" id="Task_0xwvhuo" name="B">
<incoming>SequenceFlow_0v8wuqu</incoming>
<outgoing>SequenceFlow_15fmkbq</outgoing>
<outgoing>SequenceFlow_0x4ykgp</outgoing>
<outgoing>SequenceFlow_0f4gpf1</outgoing>
</task>
<task type="goal" id="Task_0qsvlob" name="G">
<incoming>SequenceFlow_0qse1xk</incoming>
<incoming>SequenceFlow_16a0qvv</incoming>
</task>
<task type="goal" id="Task_0wtjftd" name="E">
<incoming>SequenceFlow_14u6fh7</incoming>
<incoming>SequenceFlow_0z3qle8</incoming>
<outgoing>SequenceFlow_0vg7sax</outgoing>
<outgoing>SequenceFlow_0qse1xk</outgoing>
</task>
<task type="" id="Task_0c85e6p" name="F">
<incoming>SequenceFlow_0x4ykgp</incoming>
<incoming>SequenceFlow_17k5zfg</incoming>
<outgoing>SequenceFlow_16a0qvv</outgoing>
<outgoing>SequenceFlow_0z3qle8</outgoing>
</task>
<task type="" id="Task_164ihwt" name="D">
<incoming>SequenceFlow_0q9hqs6</incoming>
<incoming>SequenceFlow_1q4991g</incoming>
<outgoing>SequenceFlow_17k5zfg</outgoing>
</task>
<task type="goal" id="Task_032o8jx" name="C">
<incoming>SequenceFlow_15fmkbq</incoming>
<incoming>SequenceFlow_0vg7sax</incoming>
<outgoing>SequenceFlow_0q9hqs6</outgoing>
<outgoing>SequenceFlow_1tszkq8</outgoing>
</task>
<task type="goal" id="Task_0fsibap" name="H">
<incoming>SequenceFlow_0f4gpf1</incoming>
</task>
</process>
我需要从起始节点找到目标节点:
他们从一开始就有一条路径,这条路径中没有目标节点。
用sample1和sample2查询进程表的结果是这样的:
+-------+----------+-------------+
| ID | nodeName | nodeID |
+-------+----------+-------------+
| 1 | B |Task_00ijt4n |
+-------+----------+-------------+
| 1 | E |Task_1d4ykor |
+-------+----------+-------------+
| 2 | B |Task_0olxqpp |
+-------+----------+-------------+
| 2 | D |Task_0zjgfkf |
+-------+----------+-------------+
如果有人能解释这个查询的解决方案,那将非常有帮助。
谢谢。
【问题讨论】:
-
只是为了弄清楚这一点:除了你的related question,你还有一个
Event元素作为开始,除了task元素之外别无他物。在您的最后一个问题中,Flow元素在哪里?而且 - 另一个非常重要的区别 - 元素的 id 不在任何地方使用。完整的流程由incoming和outgoing元素组成。这是正确的吗? -
@Shnugo 我从 XML 中删除了一个
Event元素,Flows(我们不需要它们),我在结果中添加了 id 列,最后是的,这是正确的。 -
这真的很难解决...这是一种路线规划或旅行推销员困境。有死胡同和圈子……目前我没有足够的时间深入研究它,我怀疑 T-SQL 是最好的工具。我稍后再回来......也许其他人有个好主意
-
无论如何,我认为这是
WHILE循环或CURSOR可能是正确选择的罕见时刻之一...... -
@Shnugo 我认为这是一种广度优先遍历。旅行推销员是 NP-Hard 问题,每个节点都可以启动,但在这种情况下,我有一个启动节点。
标签: sql sql-server xml traversal