0

我正在创建一个管理制造工厂的程序,我需要显示每个产品的可追溯性(从创建到最终交付的所有路径。让我给你看一个例子:工厂创建文档A001,带有数量400。然后,他们需要拆分产品,创建文档B002B003,两者都带有数量200,并且都带有Parent字段值A001。之后,它们将拆分B002为更小的部分。这将创建文档C004,和,所有文档都带有数量C005,并且都带有字段值.这些更小的碎片也可以再次分裂......C006C00750ParentB002

现在,如果我想跟踪 document 的完整周期B002,我会检查该Parent字段并将其与 document 字段交叉以获取该信息,然后获取该Parent字段所在的文档B002。那是“容易”的部分。

现在是棘手的部分。

我想知道 document 的完整周期C007。我必须检查他的父母,拿到B002文件,然后必须拿到那个文件Parent并拿到A001文件。我也会检查文件,Parent C007但没有找到。

或者知道文件的完整循环A001。我会检查是否有Parent(不会有),他们我必须用 获取所有文件Parent A001,然后用Parent B002等等获取所有文件B003

SQL 上是否有任何函数可以让我这样做,或者我是否必须创建一个一遍又一遍地重复检查父母和孩子的过程?如果是这样,我不知道该怎么做,所以任何帮助将不胜感激。

4

1 回答 1

1

基本上,您要求的是已经完成了数千次的简单事情——找到树的根。

有多种方法可以解决此问题,其中包括在 SQL Server 中支持该权利的特殊数据类型 (HierarchyId)。

https://msdn.microsoft.com/en-us/library/bb677290.aspx

是为此的文档。

也就是说,您可能会使用普通字段作为 ID - 然后最好的方法是存储过程。

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

对此有一些想法-谷歌也有很多想法(有多种方法可以查询它们)。

http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

来自相当有信誉的来源并使用这样的 CTE:

WITH MyCTE
AS ( SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EmpID, FirstName, LastName, ManagerID
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL )
SELECT *
FROM MyCTE
于 2016-02-04T09:52:54.437 回答